参考:https://www.liaoxuefeng.com/wiki/1252599548343744/1264738442933472
finally有几个特点:
1、finally语句不是必须的,可写可不写;
2、finally总是最后执行。
异常的传播
当某个方法抛出了异常时,如果当前方法没有捕获异常,异常就会被抛到上层调用方法,直到遇到某个try … catch被捕获为止
多catch语句
连续的catch
可以使用多个catch语句,每个catch分别捕获对应的Exception及其子类。JVM在捕获到异常后,会从上到下匹配catch语句,匹配到某个catch后,执行catch代码块,然后不再继续匹配。
简单地说就是:多个catch语句只有一个能被执行。所以存在多个catch的时候,catch的顺序非常重要:子类必须写在前面。
例如:
public static void main(String[] args) {
try {
process1();
process2();
process3();
} catch (IOException e) {
System.out.println("IO error");
} catch (UnsupportedEncodingException e) { // 永远捕获不到
System.out.println("Bad encoding");
}
}
父类和子类嵌套的catch
public class Main {
public static void main(String[] args) {
try {
process1();
} catch (Exception e) {
System.out.println("######Its Main#####");
e.printStackTrace();
}finally{
System.out.println("######Its Main Finally#####");
}
}
static void process1() {
try {
process2();
} catch (NullPointerException e) {
System.out.println("########Its process1########");
throw new IllegalArgumentException();
}finally{
System.out.println("######Its process1 Finally#####");
}
}
static void process2() {
throw new NullPointerException();
}
}
输出结果为:
########Its process1########
######Its process1 Finally#####
######Its Main#####
java.lang.IllegalArgumentException
at Main.process1(Main.java:19)
at Main.main(Main.java:5)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:415)
at jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
at jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)
######Its Main Finally#####