Java异常处理之⼿动抛出异常
⼀、⼿动抛出异常 throw
  在编写程序时,我们必须要考虑程序出现问题的情况。⽐如,在定义⽅法时,⽅法需要接受参数。那么,当调⽤⽅法使⽤接受到的参数时,⾸先需要先对参数数据进⾏合法的判断,数据若不合法,就应该告诉调⽤者,传递合法的数据进来。这时需要使⽤抛出异常的⽅式来告诉调⽤者。
  Java 异常类对象除在程序执⾏过程中出现异常时由系统⾃动⽣成并抛出,也可以根据需要使⽤⼈⼯创建并抛出。
  在java中,提供了⼀个 throw 关键字,它⽤来抛出⼀个指定的异常对象。在当前⽅法中不处理,抛给调⽤者处理。
 异常的对象的创建和抛出有两种⽅式:
    (1)JVM 创建并抛出
    (2)⼿动 new 出来,然后由 throw 抛出。
  Throwable:
    只有当对象是此类(或其⼦类之⼀)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出。
    类似地,只有此类或其⼦类之⼀才可以是 catch ⼦句中的参数类型。
  ⼿动抛出异常对象:
    (1)⾸先要⽣成异常类对象,然后通过 throw 语句实现抛出操作(提交给 Java 运⾏环境)
IOException e = new IOException();
throw e;
    (2)可以抛出的异常必须是 Throwable 或其⼦类的实例。下⾯的语句在编译时将会产⽣语法错误:
throw new String("want to throw");
⼆、抛出异常
  1、实现步骤
    (1)创建⼀个异常对象。封装⼀些提⽰信息(信息可以⾃⼰编写)
    (2)需要将这个异常对象告诉给调⽤者。通过关键字 throw 就可以完成。throw 异常对象。
      throw 关键字作⽤:⽤在⽅法内,⽤来抛出⼀个异常对象,将这个异常对象传递到调⽤者处,并结束当前⽅法的执⾏。
  使⽤格式:
throw new 异常类名("异常产⽣的原因");
  注意:
   (1)throw 关键字必须写在⽅法的内部
   (2)throw 关键字后边 new 的对象必须是 Exception或者Exception的⼦类对象
   (3)throw 关键字抛出指定的异常对象,我们就必须处理这个异常对象
      throw 关键字后边创建的是RuntimeException或者是 RuntimeException的⼦类对象,我们可以不处理,默认交给JVM处理(打印异常对象,中断程序)
      throw 关键字后边创建的是编译异常(写代码的时候报错),我们就必须处理这个异常,要么throws,
要么atch
  2、throw 与 throws 区别
     ⾯试题:throw 与 throws 有什么区别?
      (1)throw ⽤于⼿动抛出异常对象,是个可执⾏的语句
      (2)throws:在⽅法签名中,声明⽅法可能抛出什么异常,让调⽤者来处理这些异常。
  3、代码⽰例
1 // 主⽅法
2  public static void main(String[] args) {
3        //int[] arr = null;
4        int[] arr = new int[3];
5        int e = getElement(arr,3);
6        System.out.println(e);
7  }
8 // 定义⼀个⽅法,获取数组指定索引处的元素
9 public static int getElement(int[] arr,int index){
10        /*
11            我们可以对传递过来的参数数组,进⾏合法性校验
12            如果数组arr的值是null
13            那么我们就抛出空指针异常,告知⽅法的调⽤者"传递的数组的值是null"
14          */
15        if(arr == null){
16            throw new NullPointerException("传递的数组的值是null");
17        }
18
19        /*
20            我们可以对传递过来的参数index进⾏合法性校验
21            如果index的范围不在数组的索引范围内
22            那么我们就抛出数组索引越界异常,告知⽅法的调⽤者"传递的索引超出了数组的使⽤范围"
23          */
24        if(index<0 || index>arr.length-1){
25            /*
26         判断条件如果满⾜,当执⾏完throw抛出异常对象后,⽅法已经⽆法继续运算。
27         这时就会结束当前⽅法的执⾏,并将异常告知给调⽤者。这时就需要通过异常来解决。
28         */
29            throw new ArrayIndexOutOfBoundsException("传递的索引超出了数组的使⽤范围");
30        }
31
32        int ele = arr[index];
33        return ele;
34    }
35
   注意:NullPointerException、ArrayIndexOutOfBoundsException 是⼀个运⾏期异常,我们不⽤处理,默认交给JVM处理。
   Tips:如果产⽣了问题,我们就会throw将问题描述类即异常进⾏抛出,也就是将问题返回给该⽅法的调⽤者。对于调⽤者,有两种解决⽅式:⼀种是进⾏捕获处理,另⼀种就是继续将异常声明出去,使
⽤ throws 声明处理。
  4、扩展:Objects ⾮空判断
Objects 是由⼀些静态的使⽤⽅法组成,这些⽅法是 null-save(空指针安全的)或 null-tolerant(容忍空指针的),那么在它的源码中,对对象的null 值进⾏了抛出异常操作。
public static <T> T requireNonNull(T obj) :查看指定引⽤对象不是null。
    源码:
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
  这样,当我们需要对传递过来的参数进⾏合法判断,判断是否为 null的时候,可以直接使⽤该⽅法即可。
  Demo:nullpointerexception为什么异常
1 public static void method(Object obj){
2        //对传递过来的参数进⾏合法性判断,判断是否为null
3        /*if(obj == null){
4            throw new NullPointerException("传递的对象的值是null");
5        }*/
6
7        //quireNonNull(obj);
8        quireNonNull(obj,"传递的对象的值是null");  // ⽅法重载
9 }

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。