Java语言中,将程序执行中遇到的不正常的情况称为"异常"。
一、执行过程中发生的异常事件分为两类:
1、Error(错误):Java虚拟机无法解决的严重问题。
比如:JVM系统内部错误、资源耗尽等严重情况。StackOverflowError[栈溢出]和OOM(out of memory)。
Error是严重错误,程序会崩溃。
2、Exception:其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性代码进行处理。
比如:空指针的访问,读取不存在的文件,网络连接中断等。
Exception分为两大类:运行时异常和编译时异常(编译时异常就是由编译器检查出来的异常)。
二、⭐异常体系图:
Throwable类,所有错误或异常的超类,分为:
Error和Expection
如图:
三、五大常见运行时异常
1、NullPointerException:空指针异常
当应用程序试图在需要对象的地方使用 null 时,抛出该异常。这种情况包括:
* 调用 null 对象的实例方法。
* 访问或修改 null 对象的字段。
* 将 null 作为一个数组,获得其长度。
* 将 null 作为一个数组,访问或修改其时间片。
* 将 null 作为 Throwable 值抛出。
2、ArithmeticExpection:数学运算异常
当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。
3、ArrayIndexOutOfBoundsException:数组下标越界异常
用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。
4、ClassCastExeception:类型转换异常
当试图将对象强制转换为不是实例的子类时,抛出该异常。
例如,以下代码将生成一个 ClassCastException:
Object x = new Integer(0);
System.out.println((String)x);
5、NumberFormatException:数字格式不正确异常
当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
四、异常处理的方式
1、try-catch-finally
程序员在代码中捕获发生的异常,自行处理。
①在try中发生异常,将在异常的位置停止,异常后面的内容不再执行,直接跳入catch块。
②可以有多个catch语句,捕获不同的异常,要求父类在后,子类在前。
因为如果发生异常,只会匹配一个catch。
③也可以只使用try-finally,没有catch,这样相当于没有捕获异常,程序会在执行完finally之后直接崩掉。
应用:执行一段代码,无论是否发生异常,都需要执行的代码。
④如果有finnally,即使在catch中有return语句,不会立刻返回,会在底层将返回值保存在临时变量中。
然后是先执行完finally中代码,
若finally中没有return,则执行完后再从catch中返回,注意, 返回值为之前的临时变量保存值。
若finally中有return,则直接在finally中返回。
⑤捕获到异常之后,执行完finally代码之后,会继续执行之后的代码
try{//可能发生异常的代码
}catch(Exception e){ //若没有发生异常,则catch块代码不执行//1.异常发生后,系统将异常封装成Exception对象后传递给// catch快中的e.//2.得到异常后程序员自己处理
}finally{//无论try中代码是否有异常都要执行此块中代码。
}
2、throws
在方法声明中使用throws语句声明抛出异常的列表,可以是方法中产生的异常,也可以是它的父类。
将发生的异常抛出,交给调用者(方法来处理),最顶级的处理者是JVM。
调用者可以使用try-catch-finally解决也可以继续抛给调用者。
JVM处理异常时,先输出异常信息,然后中断程序。
①对于编译异常,程序中必须处理,使用两种方式都可。
②对于运行时异常,若程序中没有主动处理,则默认使用throws处理。
③子类重写父类方法时,对异常有规定:
子类重写的方法,所抛出的异常类型要么和父类异常一样,要么为父类异常的子类。
④抛出异常是编译异常,调用者必须处理;
抛出异常为运行时异常,调用者可以不处理,因为运行异常有默认处理方式。
四、自定义异常
当程序中出现某些错误,这些错误不在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述该异常信息。
1、步骤:
①定义类:
自定义异常类名 继承 Expection 和 RuntimeException。
②继承Expection,属于编译异常。
③继承RuntimeException,属于运行时异常。
代码中有一个throw,他与throws区别:
throw是语句抛出一个异常。
语法:
throw (异常对象);throw e;
throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
语法:
[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{......}
public void doA(int a) throws Exception1,Exception3{......}
区别①:
throws: 跟在方法声明后面,后面跟的是异常 类名
throw: 用在方法体内,后面跟的是异常类 对象名
区别②:
throws: 可以跟多个异常类名,用逗号隔开
throw: 只能抛出一个异常对象名
区别③:
throws: 表示抛出异常,由该方法的调用者来处理
throw: 表示抛出异常,由该方法体内的语句来处理
区别④:
throws: throws表示有出现异常的可能性,并不一定出现这些异常
throw: throw则是抛出了异常,执行throw一定出现了某种异常