Java can';t显示捕获的异常(newSingleThreadScheduledExecutor)

Java can';t显示捕获的异常(newSingleThreadScheduledExecutor),java,exception-handling,scheduledexecutorservice,Java,Exception Handling,Scheduledexecutorservice,对于计划执行人: executor = Executors.newSingleThreadScheduledExecutor(); Runnable ppt = new Runnable() { public void run() { try { processTask(); } catch(Exception e) {

对于计划执行人:

        executor = Executors.newSingleThreadScheduledExecutor();
        Runnable ppt = new Runnable() {
            public void run() {
                try {
                    processTask();
                } catch(Exception e) {
                    System.out.println(e.getMessage());
                    //need to be aware of this exception, no message is outputted
                }
            }
        };
        executor.scheduleWithFixedDelay(ppt, 0, 1000/20, TimeUnit.MILLISECONDS);
对于processTask方法:

       private void processTask() {
           try {
             //task business logic
           } catch(SomeOtherException e) {
                 System.out.println(e.getMessage());
                //I want to be aware of this exception also
           }
        }
我知道任务失败是有原因的,我不希望它在那之后继续(我使用executor.shutdown()来取消它)

我只需要知道捕获异常时的错误是什么。用上面的方法似乎做不到


提前感谢您的回复。

您正在将try-catch-block放入流程任务中,这就是为什么该方法中的任何问题都会在此处解决,如果您调用shutdown,则控制将不会返回到上述方法

          Runnable ppt = new Runnable() {
                public void run() {
                    try {
                    processTask();
                    } catch(Exception e) {
                        System.out.println(e.getMessage());

                    }
                }
            };
         executor.scheduleWithFixedDelay(ppt, 0, 1000/20, TimeUnit.MILLISECONDS);
在本例中,您将获得“/by zero exception”,然后调度程序将关闭

       private static void processTask() {
           try {
             //task business logic
               int x=2/0;
           } catch(Exception e) {
                 System.out.println(e.getMessage());
                //I want to be aware of this exception also
                  executor.shutdown();
           }
        }

尝试使用
e.printStackTrace()
getMessage()
是每个异常类(如
arithmetricexception
继承的
Throwable类
(Java所有异常的超类)的方法。
getMessage()
方法仅打印对象e打印的输出的消息部分(如果有消息可用)。当printStackTrace()方法打印完整堆栈跟踪以及出现异常的行号时,会显示错误消息-请参阅:

正如Kostja所回答的那样

消息和stacktrace是两个不同的数据块 信息。虽然stackstrace是必需的,但消息不是必需的。 大多数异常都传递消息,这是最佳实践,但是 有些人就是做不到,也没有什么办法来解决它


有关更多信息,您可以在此处和中看到类似的查询。

您确定Runnable实际正在执行吗?是的,executor.scheduleWithFixedDelay句柄我相信。它的可能副本应该,但最好检查您关于为什么看不到堆栈跟踪的结论是否正确。如果出现异常,您的代码应该打印一些内容。我能想到的唯一可能性是:(I)没有引发异常(ii)控制台不可用(iii)您没有看到正确的控制台(iv)异常消息是空的。有关处理异常和ScheduledExecutorService的更好方法,请参阅我指向的副本。感谢您的响应,但我也在添加我忘记包含在OP中的消息。例如system.out.println(e.getMessage()+“其他信息”);谢谢,这可能会解决我的问题。明天我将在这里进行更改。在为可由应用程序的其他部分/段或应用程序外部重用的方法编写代码时,使用throws关键字通知/提醒调用方要处理的特定异常,而不是在方法本身中使用try-catch块。因为不同的用户(或不同段/类/场景中的同一用户)可能需要根据需要显示不同的错误相关消息。因此,它为使用您的方法的所有调用者提供了灵活性。