我有一个非常简单的 Runnable,我想安排它每 30 秒执行一次 - 请记住,这只是这个问题的一个简单示例,而不是实际使用它的实际意义。
@Override
public void run() {
System.out.println("Throwing an unchecked exception on purpose...");
int abc = 123 - 123;
int def = 123 / abc;
}
我在使用 Timer 和 TimerTask 时遇到了一个问题:每当 TimerTask 引发未经检查的异常时,该任务的任何后续执行都将被取消;因此上面的任务实际上只会运行一次,因为它会抛出一个未经检查的除以 0 的异常。
据我所知,ScheduledThreadPoolExecutor 具有完全相同的“功能”,至少根据官方 Java API 文档“如果任务的任何执行遇到异常,后续执行将被抑制”。
Java 中是否有任何标准方法可以使 Timer 或 ScheduledThreadPoolExecutor 在引发未经检查的异常时不抑制后续执行?
非常感谢。
最佳答案
Is there any standard way in Java to make either Timer or ScheduledThreadPoolExecutor to don't suppress subsequent executions if an unchecked exception is raised?
好吧,有一种非常简单的方法 - 创建一个 ExceptionSuppressingRunnable
来包裹另一个:
public final class ExceptionSuppressingRunnable implements Runnable
{
private final Runnable original;
public ExceptionSuppressingRunnable(Runnable runnable)
{
// TODO: Null validation
}
public void run()
{
try
{
original.run();
}
catch (RuntimeException e)
{
// TODO: Logging
}
}
}
请注意,这有意不捕获 Error
(或 Throwable 的任何其他非异常子类)。您可以捕获Exception
而不是RuntimeException
- 它只会在奇怪的情况下有所不同,代码在没有声明的情况下抛出已检查的异常(由于字节码重写、版本控制差异或其他)。我认为只捕获 RuntimeException
可能更清楚。
关于java - 在 Java 中安排重复任务而不让它们因未经检查的异常而停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11799856/