当前位置: 首页 > 知识库问答 >
问题:

在Java中调度重复性任务,而不在未检查的异常中停止

钱季
2023-03-14

我有一个非常简单的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引发未经检查的异常时,该任务的任何后续html" target="_blank">执行都将被取消;因此,上面的任务实际上只运行一次,因为它会抛出一个未经检查的除法为0的异常。

据我所知,ScheduledThreadPoolExecutor具有完全相同的“特性”,至少根据官方Java API文档,“如果任务的任何执行遇到异常,后续执行将被抑制”。

如果引发未检查的异常,Java是否有任何标准方法使计时器或计划线程池执行器不抑制后续执行?

非常感谢。

共有1个答案

浦思源
2023-03-14

如果引发未检查的异常,Java是否有任何标准方法使计时器或计划线程池执行器不抑制后续执行?

有一个非常简单的方法——创建一个例外支持Runnable,它封装了另一个例外:

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中有这个工厂方法: 我想将两个已检查的异常转换为未检查的异常。最好的方法是什么? 我是否应该仅捕获异常并使用捕获的异常作为内部异常抛出新的RuntimeException? 有没有更好的方法可以做到这一点?或者我应该首先尝试这样做吗? 编辑: 只是为了澄清。这些异常将是致命的,因为配置文件实质上是程序的运行,所有异常都将在程序的顶层捕获并记录。 我的目的是避免不必要的引发异

  • 问题内容: 我在一个带有旧服务层的项目上工作,如果请求的记录不存在,或者由于调用者未得到授权而无法访问,则在很多地方返回null。我说的是ID要求的特定记录。例如,类似: 最近,我一直在努力更改此API,或者用引发异常的新API进行补充。随之而来的是关于检查与未检查的异常的争论。 从JPA / Hibernate等所有设计师的笔记中,我建议未检查的异常可能是最合适的。我的观点是,不能合理地期望AP

  • 项目中有一个要求,该要求将具有将完成某些工作的计划任务。 该项目是基于Spring的,计划的作业将是应用程序大战的一部分。我以前从未实现过这种功能。 我听说过Quartz。此外,我在某处读到Spring提供了一些功能来安排任务。所以,我在想如果我已经在使用Spring,那么为什么要使用其他API(Quartz)。 我不确定使用哪一个?一个比另一个的优缺点是什么? 请提出满足我要求的最佳方式。

  • 问题内容: 我在理解Java 和异常之间的区别时遇到了一些问题。 首先,异常应该在编译时寻找异常。在不同来源中提供的示例引用了数据库连接性,其中一些是文件处理,而异常应该是在程序员方面寻找错误,例如索引超出数组范围等。 不应该反过来吗?我的意思是,数据库连接是在运行时完成的,对吧?文件处理也是如此。您没有在编译时打开文件句柄,那么为什么在编译时会寻找一个可能的错误呢?另一方面,超出数组范围的索引已

  • 问题内容: 有人告诉我,在Java中,可以在try块中捕获未检查的异常,但是如果捕获了它,就不称为已检查的异常吗? 问题答案: 未检查的异常是不需要在- 块中捕获的异常。未检查的异常是或类的子类。 已检查的异常是需要在- 块中捕获的异常。 可在Java语言规范的11.2节:编译时检查异常中找到检查和未检查异常的定义: 未检查的异常类是类及其子类,以及类及其子类。所有其他异常类都是检查的异常类。 仅

  • 问题内容: 约书亚·布洛赫(Joshua Bloch)在《有效的Java》中说 将检查的异常用于可恢复的条件,将运行时异常用于编程错误(第二版中的项目58) 让我们看看我是否正确理解了这一点。 这是我对检查异常的理解: 1.以上是否被视为经过检查的异常? RuntimeException是未经检查的异常吗? 这是我对未经检查的异常的理解: 4.现在,上面的代码难道不是一个检查过的异常吗?我可以尝试