//在main方法中,调用方法arrayValueOfIndex int value = arrayValueOfIndex(array, 3); //在arrayValueOfIndex方法中 int value = array[index]; 此时index=3 一、即访问了数组中的3索引,而数组是没有3索引的,这时候,JVM就会检测出程序会出现异常,JVM会做两件事: 1.JVM会根据异常产生的原因创建一个异常对象,这个异常对象包含了异常产生的内容、原因和位置 new ArrayIndexOutOfBoundsException("3"); 2.在arrayValueOfIndex方法中,没有异常处理逻辑(try...catch),那么JVM就会把异常对象抛出给方法的调用者main方法来处理这个异常 二、main方法接收到了这个异常对象(new ArrayIndexOutOfBoundsException("3");),main方法中也没有异常处理逻辑,就会继续把对此昂抛出给main方法的调用者JVM处理。 三、JVM接收到了这个异常对象(new ArrayIndexOutOfBoundsException("3");),做了两件事: 1.把异常对象的内容、原因和位置以红色的字体打印在控制台 2.JVM会终止当前正在执行的java程序——【中断处理】
原因分析: try中可能会产生的异常对象: new ArrayIndexOutOfBoundsException("3"); new IndexOutOfBoundsException("3"); try中如果出现了异常对象,会把异常对象抛出给catch处理 抛出的异常对象,会从上到下【依次赋值】给catch中定义的异常变量: ArrayIndexOutOfBoundsException e = new ArrayIndexOutOfBoundsException("3"); IndexOutOfBoundsException e = new IndexOutOfBoundsException("3"); 这样是没有问题的。 但是如果父类变量写在了子类变量上边,则会有问题: IndexOutOfBoundsException e = new ArrayIndexOutOfBoundsException("3"); //多态写法 IndexOutOfBoundsException e = new IndexOutOfBoundsException("3"); 也就是,不管是哪一个异常对象,都可以由父类异常变量接收,所以子类异常变量是没有被用到的,会报错 3.多个异常一次捕获,一次处理 4.如果finally有return语句,永远返回finally中的结果,避免该情况,即finally中不要写return语句。
public static T requireNull(T obj):查看指定引用对象不是null。 源码: public static T requireNonNull(T obj){ if(obj == null) throw new NullPointerException(); return obj; }
自定义异常类:
java提供的异常类,不够我们使用,需要自己定义一些异常类 格式: public class XxxException extends Exception/Runtime Exception{ 添加一个空参构造方法 添加一个带异常信息的构造方法 } 注意: 1.自定义异常类一般都是以Exception结尾,说明该类是一个异常类 2.自定义异常类,必须继承Exception或者RuntimeException 继承Exception,那么自定义的异常类,就是一个编译期异常,如果方法内部抛出了编译器异常,就必须处理这个异常,要么throws,要么try...catch 继承RuntimeException,那么自定义的异常类,就是一个运行期异常,无需处理,交给JVM处理——中断处理。 添加一个带有异常信息的构造方法: 查看源码发现,所有的异常类都会有一个带异常信息的构造方法,方法内部会调用父类带异常信息的方法,让父类来处理这个异常信息,实际上调用的是父类的空参构造方法。