1

我有一个非常简单的 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 不抑制后续执行?

非常感谢。

4

1 回答 1

4

如果引发未经检查的异常,Java中是否有任何标准方法可以使 Timer 或 ScheduledThreadPoolExecutor 不抑制后续执行?

好吧,有一种非常简单的方法 - 创建一个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- 它只会在代码抛出已检查异常而不声明它的奇怪情况下产生影响(由于字节码重写、版本控制差异或其他原因)。我认为 catch 可能更清楚RuntimeException

于 2012-08-03T16:43:00.030 回答