标签:stat 调用 pre 添加 run err void rgs 多个
//1.Java的异常
异常继承自throwable异常根体系
它有两个体系,一个是error一个是Execption
Exception又分为两大类:
RuntimeException以及它的子类;
非RuntimeException(包括IOException、ReflectiveOperationException等等)
Java规定:
必须捕获的异常,包括Exception及其子类,但不包括RuntimeException及其子类,
这种类型的异常称为Checked Exception。
不需要捕获的异常,包括Error及其子类,RuntimeException及其子类。
//2.异常捕获
同时,如果异常处理语句相同,可以放到一个catch下
如:
catch(IOException | RuntimeException){
......
}
使用try ... catch ... finally时:
多个catch语句的匹配顺序非常重要,子类必须放在前面;
finally语句保证了有无异常都会执行,它是可选的;
一个catch语句也可以匹配多个非继承关系的异常
//3.抛出异常
当某个方法抛出异常时,如果当前方法没有捕获异常,就会往上一层传播直到被捕获
即直到遇见try....catch
如何抛出异常
<1>创建一个Exception的实例
<2>用throw语句抛出
因此,在catch中抛出异常,不会影响finally的执行。JVM会先执行finally,然后抛出异常。
异常屏蔽
如果在执行finally语句时抛出异常,那么catch中的异常就不会抛出了
在极少数情况下我们需要获知所有的异常,
方法是先用origin变量保存原始异常,然后调用Throwable.addSuppressed(),
把原始异常添加进来,最后在finally抛出:
public class Main {
public static void main(String[] args) throws Exception {
Exception origin = null;
try {
System.out.println(Integer.parseInt("abc"));
} catch (Exception e) {
origin = e;
throw e;
} finally {
Exception e = new IllegalArgumentException();
if (origin != null) {
e.addSuppressed(origin);
}
throw e;
}
}
}
通过Throwable.getSuppressed()可以获取所有的Suppressed Exception。
绝大多数情况下,在finally中不要抛出异常。
因此,我们通常不需要关心Suppressed Exception。
标签:stat 调用 pre 添加 run err void rgs 多个
原文地址:https://www.cnblogs.com/tsruixi/p/11767896.html