java - 在 Java 中安排重复任务而不让它们因未经检查的异常而停止

标签 java exception task timertask

我有一个非常简单的 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/

相关文章:

java - 在 Java 中使用 .hasNextInt() 进行一些简单的异常处理有问题吗?

c# - 有没有办法预测 `Marshal.GetExceptionForHR(code, pointers)` 会抛出 `AccessViolationException`

java - 二叉搜索树,添加相同元素异常(exception)。

c# - 无法将文件写入 Windows 7 中的 Application.StartupPath

java - JBPM - 获取所有任务的列表

java - 检查通用实例?

java - 无法在方法中添加到 arrayList

c# - 任务工厂和线程本地存储

java - Gradle:从子项目复制 application.properties 文件

java - 收到类型错误的非法启动