我有一个非常简单的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不抑制后续执行?
非常感谢。
答案 0 :(得分:4)
如果引发未经检查的异常,Java中是否有任何标准方法可以使Timer或ScheduledThreadPoolExecutor不抑制后续执行?
有一种非常简单的方式 - 创建一个包含另一个<{p}}的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
可能更清楚。