【问题标题】:No output from exception异常没有输出
【发布时间】:2011-01-28 09:18:17
【问题描述】:

为什么这段代码不打印异常堆栈跟踪?

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)

【问题讨论】:

    标签: java multithreading exception executorservice


    【解决方案1】:

    执行程序可能会在线程上设置自己的未捕获异常处理程序,因此堆栈跟踪不会打印到控制台。如果在Runnable 中抛出异常,您可以从scheduleAtFixedRate 方法返回的ScheduledFuture 对象中获取它:

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

    【讨论】:

    • 它不需要在线程上设置未捕获的异常处理程序。它无论如何都需要捕获异常以将其报告给将来,并且由于它仍然需要线程,因此无法重新抛出异常。
    【解决方案2】:

    StackOverflow 上有一个类似的问题提供了Unhandled exceptions with Java scheduled executors 的答案。

    基本上你可以在scheduleAtFixedRate() javadoc看到什么:

    如果任务的任何执行 遇到异常,后续 处决被禁止

    所以,我从这里概括一下,通过ScheduledExecutorService.scheduleAtFixedRate() 提交任务时,您永远不会看到您的异常。

    【讨论】:

      【解决方案3】:

      执行器服务出于某种原因倾向于吞下异常。它可以使调试变得非常具有挑战性。只需在 run 方法的内容周围添加一个 try catch,如下所示:

      public void run() {
        try
          dummyInt = Integer.parseInt("AAAA");
      
          if (dummyBoolean) {
            dummyBoolean= false;
          } else {
            dummyBoolean= true;
          }
        } catch (Exception e){
          e.printStackTrace();
        }
      
      }
      

      Here's 相关问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        • 2019-07-14
        相关资源
        最近更新 更多