2010-03-17 82 views
4

爲什麼此代碼不打印異常堆棧跟蹤?沒有異常輸出

public class Playground { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     startThread(); 
    } 

    private static void startThread() { 
     ScheduledExecutorService timer = Executors 
       .newSingleThreadScheduledExecutor(); 
     Runnable r = new Runnable() { 
      int dummyInt = 0; 
      boolean dummyBoolean = false; 

      @Override 
      public void run() { 
       dummyInt = Integer.parseInt("AAAA"); 

       if (dummyBoolean) { 
        dummyBoolean= false; 
       } else { 
        dummyBoolean= true; 
       } 

      } 

     }; 

     timer.scheduleAtFixedRate(r, 0, 100, TimeUnit.MILLISECONDS); 

    } 

} 

我該如何得到它?

我希望看到這一點:

java.lang.NumberFormatException: For input string: "AAAA" 
    at java.lang.NumberFormatException.forInputString(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at java.lang.Integer.parseInt(Unknown Source) 
    at Playground$1.run(Playground.java:25) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(Unknown Source) 
    at java.util.concurrent.FutureTask.runAndReset(Unknown Source) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(Unknown Source) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(Unknown Source) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

回答

8

執行人可能將線程自身未捕獲的異常處理程序,所以堆棧跟蹤將不被打印到控制檯。如果一個異常在Runnable扔你可以通過scheduleAtFixedRate方法返回的ScheduledFuture對象得到它:

ScheduledFuture<?> future = timer.scheduleAtFixedRate(r, 0, 100, TimeUnit.MILLISECONDS); 
try { 
    future.get(); 
} catch (ExecutionException e) { 
    Throwable cause = e.getCause(); 
    cause.printStackTrace(); 
} 
+0

有沒有必要在線程上設置未捕獲的異常處理程序。無論如何,它需要捕捉異常並將其報告給未來,並且無法重新拋出異常,因爲它仍然需要該線程。 – 2010-03-17 01:16:10

1

由於某種原因,執行程序服務傾向於吞下異常。它可以使調試相當具有挑戰性。只需添加一個嘗試捕捉周圍的運行方法,像這樣的內容:

public void run() { 
    try 
    dummyInt = Integer.parseInt("AAAA"); 

    if (dummyBoolean) { 
     dummyBoolean= false; 
    } else { 
     dummyBoolean= true; 
    } 
    } catch (Exception e){ 
    e.printStackTrace(); 
    } 

} 

Here's一個相關的問題。