2010-03-17 58 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一个相关的问题。