2016-12-15 7 views
3

예외에 대한 질문 캐치 마지막 블록에 던져 가지고 : 나는 한 번 더 위의 코드를 실행하기 위해 노력했다예외는 마침내 발생과 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에 대한 예외를 작성한 try/catch 블록에 전체 주 방법을 래핑 할 수 있습니다.이 시점에서 모든 기존 System.out 호출과 동기화되며 경쟁 조건이 없습니다.