2009-02-04 5 views
5

Java의 catch 블록에서 명령문 실행 순서에 대한 질문이 있습니다. 다음 클래스 Test1 (아래 참조)을 실행할 때 출력이 처음으로 Hi !, e.printStackTrace(); 성명서, 그리고 안녕!. 그러나, 나는이 순서를 결코 얻지 않는다. 제가 아래에 붙여 넣은 결과물을보십시오.Java의 try-catch 블록 - catch 코드의 실행 문

public class Test1 { 

    public static void calculate() { 
     try { 
      int h = 5/0; 
     } catch (ArithmeticException e) { 
      System.out.println("Hi!"); 
      e.printStackTrace(); 
     } 
     System.out.println("Bye!"); 
    } 

    public static void main(String[] args) { 
     calculate(); 
    } 

} 

출력 1 :

 
Hi! 
Bye! 
java.lang.ArithmeticException:/by zero 
    at Test1.calculate(Test1.java:6) 
    at Test1.main(Test1.java:15) 

출력 2 :

 
java.lang.ArithmeticException:/by zero 
    at Test1.calculate(Test1.java:6) 
    at Test1.main(Test1.java:15) 
Hi! 
Bye! 

나는 두 가지 질문이 있습니다

1) 더 중요한 질문 : 왜 난 항상 안녕이를! 그리고 안녕! 코드에서 mye.printStackTrace()가 그들 사이에 있더라도 항상 하나씩 인쇄됩니다.

2.) 안녕하세요! 전에 e.printStackTrace() 문을 출력하는 경우가 종종 있는데, 때로는 안녕히 가십시오! ? 나는 프로그램을 여러 번 실행했으며 어느 상황에서 하나 또는 다른 인쇄물을 얻는 지 이해할 수 없습니다.

감사합니다.

Java 6 및 Eclipse (Ganymed)를 사용하고 있습니다. "Hi!"및 "Bye!"System.err 반면에

답변

18

Exception.printStackTrace() 지문 System.out에있다. 일반 콘솔에서 프로그램을 실행하면 결국 화면에 표시되지만 순서가 잘못되었을 수 있습니다. IDE (예 : NetBeans)를 통해 프로그램을 실행하는 경우 스트림을 색상으로 구분하여 쉽게 구분할 수 있습니다.

2

타이밍 문제 일 수 있습니다. Println은 표준 출력에 기록하지만 printStackTrace는 표준 오류에 연결될 수 있습니다. 그렇다면 버퍼가 먼저 플러시되는 문제 일뿐입니다.

7

"안녕하세요!" 와 "안녕!" 스택 트레이스는 System.err (즉, stderr)에 인쇄되는 동안 System.out (즉, stdout)까지 증가합니다. 인쇄 순서는 두 버퍼가 플러시 될 때 결정됩니다.

+1

Throwable # printStackTrace()에 스트림을 지정할 수 있습니다. e.printStackTrace (System.out) –

0

매 인쇄 (printStackTrace 포함) 후에 System.out.flush()를 추가하십시오.

+0

출력 순서 예측을 수정하지 않습니다. – mark

1

A1 - e.printStackTrace()는 System.err이 아니라 System.out에 인쇄하므로 스트림이 다르며 인쇄 순서가 다릅니다.