a.异常
1.java内置了异常处理机制,总是用异常来表示错误。
2.Throwable是异常体系的根,分两个体系:Error和Exception,Error表示严重错误,程序无法处理;Exception是运行时错误,可以被捕获并处理。
3.Exception分为两类
1.RuntimeException以及它的子类。
2.非RuntimeException(IOException)。
4.java规定
1.必须捕获的异常,Exception以及它的子类,不包括RuntimeException及其子类,这种异常叫做Checked Exception。
2.不需要捕获的异常,Error及其子类,RuntimeException及其子类。
5.注意
1.编译器对RuntimeException及其子类不做强制捕获要求,不是指应用程序本身不应该捕获并处理,具体问题具体分析。
2.只要在方法中声明了Checked Exception,不在调用层捕获,也必须在更高的调用层捕获,main()方法是最后捕获Exception的机会。
3.java的异常是class,并且从Throwable继承。
b.关键字
1.try
抛出异常
2.catch
捕获异常
3.final
1.无论发生什么异常,都会被执行(清理资源等)。
2.不是必须的,可写可不写。
3.总是最后执行。
4.throw
当程序发生异常而无法处理的时候,会抛出对应的异常对象
5.throws
在类中捕获异常信息,标明方法可能抛出的异常。
c.捕获异常
1.多catch语句
1.使用多个catch语句捕获异常,每个catch捕获对应的异常及其子类,JVM在捕获到异常后,从上到下匹配catch语句,匹配成功后,执行代码块并不再继续匹配,即多个catch语句只会执行一个。
2.顺序很重要,子类必须放在前面,否则永远执行不到。
2.捕获多种异常
1.有些异常逻辑相同,但异常本身不存在继承关系。
d.抛出异常
1.创建Exception(异常)实例;用throw语句抛出 。例:throw new 异常类();
2.一个方法捕获了某个异常后,又在catch语句中抛出新的异常,相当于把抛出的异常类型“转换”了;
为了能保留原始异常信息,需要把原始异常的信息传递给新的异常,可进行原始异常定位。
3.捕捉到异常再次抛出时,一定要传递原始信息,否则很难定位到第一案发现场。
构造异常时,把原始的Exception实例传进去,新的Exception就可以持有原始Exception信息。
4.屏蔽异常
1.finally抛出异常后,原来在catch中准备抛出的异常就“消失”了,因为只能抛出一个异常。没有被抛出的异常称为“被屏蔽”的异常(Suppressed Exception)。
2.在绝大多数情况下,finally里不要抛出异常。因此,我们通常不关心Suppressed Exception。
e.自定义异常类
1.抛出异常时,尽量使用JDK已定义的异常类型。
2.尽量从RuntimeException派生根异常(BaseException),再从根异常派生业务异常。
3.自定义异常时,应提供多种构造方法,照抄父类的构造方法即可。
f.NullPointException(NPE)
1.一个对象为null,调用其字段或方法,这个异常通常是由JVM抛出的。
2.是一种代码逻辑错误,处理原则:早暴露早修复。
3.java14后,JVM可以给出详细信息直接定位null对象。