嗨,有人可以看看这个程序吗?我不明白为什么输出是_c
。书中的答案是“一旦s3()将异常抛出到s2(),s2()会将它抛出到s1(),并且不再执行s2()的代码。”为什么不呢?
public class Plane {
static String s = "_";
public static void main(String[] args) {
new Plane().s1();
System.out.println(s);
}
void s1() {
try { s2(); }
catch (Exception e) { s += "c"; }
}
void s2() throws Exception {
s3(); s+= "2";
s3(); s+= "2b";
}
void s3() throws Exception {
throw new Exception();
}
}
答案 0 :(得分:2)
s3
对s2
的第一次调用导致在s2
中发生任何连接之前抛出异常,因此s2
中的任何字符串添加都不会永远执行。因此,原始字符串的唯一添加是s1
中捕获该异常的位置。
答案 1 :(得分:1)
输出是" _c"因为在这段代码中:
void s2() throws Exception {
s3(); // THIS IS THE LINE THAT THROWS
s+= "2";
s3();
s+= "2b";
}
调用包含对s3的调用的第一行,并抛出异常。然后该异常再次被抛到s1,并被捕获。您通常不希望代码在未经检查的异常之后运行,因为您将获得未定义的行为或程序崩溃。
答案 2 :(得分:1)
因为抛出异常意味着发生了错误,并且该方法无法继续;调用方法可能能够,如果它捕获异常,这就是s1
可以在c
上添加的原因。
答案 3 :(得分:1)
来自Java Language Specification(第11.3节)
当抛出异常时(§14.18),控制权从中转移 导致异常的代码到最近的动态封闭 如果有的话,可以处理的try语句(§14.20)的catch子句 例外
当s1()调用s2()时,s2()所做的第一件事就是调用抛出异常的s3()。 s2()无法处理它并将其抛出到s1()。 s1()捕获异常并将“c”追加到s。