【中行笔试复盘】JAVA异常处理机制的一些细节

参考: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#####


版权声明:本文为nini_k原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。