代码之家  ›  专栏  ›  技术社区  ›  mainstringargs

异常没有输出

  •  4
  • mainstringargs  · 技术社区  · 14 年前

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

    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)
    
    3 回复  |  直到 14 年前
        1
  •  8
  •   Kevin K    14 年前

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

    ScheduledFuture<?> future = timer.scheduleAtFixedRate(r, 0, 100, TimeUnit.MILLISECONDS);
    try {
        future.get();
    } catch (ExecutionException e) {
        Throwable cause = e.getCause();
        cause.printStackTrace();
    }
    
        2
  •  1
  •   Community leo1    7 年前

    由于某种原因,执行器服务倾向于接受异常。它可以使调试非常具有挑战性。只需在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 一个相关的问题。

        3
  •  0
  •   Community leo1    7 年前

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

    基本上你可以在 scheduleAtFixedRate() javadoc :

    如果任务有任何执行 遇到异常,随后 禁止执行

    所以,我从这里概括地说,当通过 ScheduledExecutorService.scheduleAtFixedRate() .