2013-02-28 57 views
2

當我運行下面的代碼時,有兩個結果。有例外的流程控制

package scjp; 

    public class ExceptionTest { 

     public static void main(String[] args) { 
      ExceptionTest test = new ExceptionTest(); 
      test.method1(); 
     } 

     public void method1() { 
      try { 
       System.out.println("Try Block"); 

       if (!true) { 
        return; 
       } else { 
        throw new RuntimeException(); 
       } 
      }finally { 
       System.out.println("Finally Block"); 
      } 
     } 
    } 

一個結果是

Try Block 
Exception in thread "main" java.lang.RuntimeException 
    at scjp.ExceptionTest.method1(ExceptionTest.java:17) 
    at scjp.ExceptionTest.main(ExceptionTest.java:7) 
Finally Block 

和其他

Try Block 
Finally Block 
Exception in thread "main" java.lang.RuntimeException 
    at scjp.ExceptionTest.method1(ExceptionTest.java:17) 
    at scjp.ExceptionTest.main(ExceptionTest.java:7) 

每次我運行上面的代碼,答案正在發生變化。在我的理解中,它應該始終是相同的結果。你能幫我嗎?

回答

5

系統錯誤輸出流(上面的堆棧跟蹤,可能在控制檯中顯示爲紅色)與系統輸出流(您的System.out.println()語句)不同。因此,錯誤消息可能與正常的控制檯輸出不同步,因爲兩個流都寫入控制檯,但彼此獨立。它們的區別如下:

System.out.println("Some text"); 

打印到輸出流

System.err.println("Error occurred!"); 

打印到錯誤流

輸出到同一個控制檯時,兩者可以得到混合。

+0

+1你比我快:) – pgras 2013-02-28 11:33:01

0

異常堆棧跟蹤不會打印在同一個outputstrean上(它打印在System.err上)並且System.err和System.out不同步。

要始終具有相同的輸出,您可以在System.err而不是System.out上打印消息。