Java公共类Plane

时间:2015-02-27 17:44:19

标签: java

嗨,有人可以看看这个程序吗?我不明白为什么输出是_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();
            }

}

4 个答案:

答案 0 :(得分:2)

s3s2的第一次调用导致在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。