2016-12-15 86 views
3

都扔在catch和finally块异常问题:异常抛出终于和catch块

class MyExc1 extends Exception {} 
class MyExc2 extends Exception {} 
class MyExc3 extends MyExc2 {} 

public class C1 { 
    public static void main(String[] args) throws Exception { 
     try { 
      System.out.print(1); 
      q(); 
     } 
     catch (Exception i) { 
      throw new MyExc2(); 
     } 
     finally { 
      System.out.print(2); 
      throw new MyExc1(); 
     } 
    } 
    static void q() throws Exception { 
     try { 
      throw new MyExc1(); 
     } 
     catch (Exception y) { 
      System.out.print(3); 
     } 
     finally { 
      System.out.print(4); 
      throw new Exception(); 
     } 
    } 

} 

我试图执行上面的代码超过一次。它每次给我不同的输出。

output 1: 1Exception in thread "main" 342test.MyExc1 
at test.C1.main(C1.java:18) 
output 2: 1342Exception in thread "main" test.MyExc1 
at test.C1.main(C1.java:18) 
output 3: 1Exception in thread "main" test.MyExc1 
342 at test.C1.main(C1.java:18) 
output4: 1Exception in thread "main" 34test.MyExc1 
2 at test.C1.main(C1.java:18) 

请解释。

回答

11

所有你看到的是写作之间的竞争条件,以System.outSystem.err。您明确地调用System.out.print,分别为1,然后是3,然后是4,然后是2,并且抛出异常并自动转储至System.err。所以你得到的每个输出都是“1342”,其中有某处存在异常堆栈跟踪。

实际执行流程在每种情况下都是一样的 - 它是只有的输出是不同的。为了证明这一点,你可以在其中写了例外System.out,此时它会与所有现有System.out电话同步,而且会是无竞争状态try/catch块包住整个主要方法。