异常的分类:
java.lang.Throwable 是java中所有错误或异常的超类。
Exception:编译期异常、RuntimeException 运行期异常。
Error:错误
处理异常的方式:
1、抛出异常throws,给jvm处理,异常中断后程序中断。
2、捕获异常try..catch,异常捕获后接着执行后续代码。
异常产生的过程:
main方法里,调用方法1,方法1里访问数组元素arr[3],如果越界,jvm就会检测出程序会出现异常。
jvm会做2件事情:
a、JVM会根据异常产生的原因创建一个异常对象,这个异常对象包含了一次产生的(内容、原因、位置)
new ArrayIndexOutOfBoundsException(“3”)
b、被调用的方法中,如果没有异常的处理逻辑(指try..catch),那么JVM会把异常对象抛出给方法的调用者(main方法)来处理这个异常。main方法也处理不了,就交给了JVM处理。
c、JVM会在控制台打印异常对象(内容、原因、位置),并且终止正在执行的java进程,中断处理。
举例如下:
异常的处理:
0、throw关键字
注意:a、throw关键字必须写在方法的内部。
b、throw关键字后面new的对象必须是Exception或Exception的子类对象。
c、throw关键字抛出的异常对象,我们必须处理这个异常对象。
throw后创建的是运行期异常:RuntimeException或RuntimeException子类对象,我们可以不处理,交给jvm处理(打印异常对象,中断程序)
throw后创建的是编译异常(写代码时报错,例如FileNotFoundException,IOException属于编译异常),必须处理这个异常,要么throws,要么try..catch
举例: 方法入参校验,如果方法入参有数组,这个数组碰巧是null,那就throw NullPointException(NullPointException属于运行期异常,可以不处理,自动交给jvm中断)
索引<0或>数组的最大索引,也会抛出异常ArrayIndexOutOfBoundsException(属于运行期异常,可以不处理,自动交给jvm中断)
使用技巧:判断一个入参对象是否为空,直接调用Objects.requireNonNull(对象名,"异常信息提示")
1、throws声明异常关键字 ,交给别人处理异常
使用格式:方法声明时候使用
抛出的异常与声明的异常要一一对应。
修饰符 返回值类型 方法名(参数列表) throws AAException,BBException..{
throw new AAException(“异常产生原因”)
throw new BBException(“异常产生原因”)
...
}
注意:
1、throws关键字必须写在方法声明处。
2、throws关键字后边声明的异常必须是Exception或它的子类。
3、方法内部如果抛出了多个异常对象,那么throws后边也必须声明多个异常。 如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可。(FileNotFoundException,IOException,Exception父类,这三个只要声明Exception)
4、方法A调用了一个声明抛出异常的方法B,就必须处理声明的异常。要么继续使用throws声明抛出,交给方法的调用者处理,最终交给jvm;要么try..catch处理异常。
5、因为异常被jvm中断处理,异常之后的代码不会被执行
2、try...catch,自己处理异常
try{
可能出现异常的代码
}catch(异常类型 变量名){
}
catch(异常类型 变量名){
}
注意:
1、try可能出现多个异常对象,可以使用多个catch处理这些异常。
2、如果try中产生了异常,就会执行catch中的异常处理逻辑,执行完catch中的处理逻辑,继续执行catch之后的代码。如果try中没产生异常,就不执行catch中的代码,直接执行catch之后的代码。
3、try中抛出什么异常对象,catch就定义什么样的异常变量,用来接收这个异常对象。
Throwable处理异常的三个方法
public string getMessage();
public string tostring();
public void printStackTrace();默认方法,信息最全面。
finally代码块
无论是否出现异常都会执行。
注意:
1、finally一般用于资源释放,无论程序是否异常,最后都要执行释放。
2、finally不能单独使用,必须和try一起使用。
多个异常一个try捕获,多次catch处理:catch里定义的异常变量如果有子父类关系,那么子类的异常变量必须写在最上面,否则会报错。
多个异常多个try捕获,多次catch处理
多个异常一个try捕获,一次catch处理