为什么Java代码的输出在“ adb”之下,而不在“ abd”之下?

时间:2019-10-09 16:28:59

标签: java exception callstack

我试图了解运行时以下异常代码的输出。我知道打印的内容是“ adb”,但我不明白为什么要打印。

public class MyClass {
static String str = "a";

public static void main(String[] args) {
    new MyClass().method1();
    System.out.println(str);
}

void method1() {
    try {
        method2();
    }
    catch (Exception e) {
        str += "b";
    }
}

void method2() throws Exception {
    try {
        method3();
        str += "c";
    }
    catch (Exception e) {
        throw new Exception();
    }
    finally {
        str += "d";
    }
    method3();
    str += "e";
}

void method3() throws Exception {
    throw new Exception();
}
}

调用method3()时,它将引发一个新异常,该异常被method2()捕获,还引发一个新异常,该异常被method1()捕获,在字符串中添加“ b”,最后添加块在method2()中执行,添加“ d”?那么为什么它不是“ abd”,而是“ adb”?

1 个答案:

答案 0 :(得分:1)

str = "a"

现在称为method1()

现在method2()中的method1()被调用

现在method3()中的method2()被调用 并引发异常,则该异常将捕获在method2()中,并且不会执行str+= "c"。而是抛出一个新的异常,并执行finally子句:

str += d

method3()再次被调用,引发异常,该异常又被添加到method1()添加中

str += b

我们在这里。