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块。因为不同的用户(或不同段/类/场景中的同一用户)可能需要根据需要显示不同的错误相关消息。因此,它为使用您的方法的所有调用者提供了灵活性。