我有一项服务,我希望它具有以下行为:
- 如果服务收到
InterruptedException
,或者 JVM 关闭,它应该尝试正常停止 - 如果发生一些“灾难性”事件,服务应该退出
- 应记录任何其他异常,应重置状态,并且循环应继续运行
- 循环不应在任何其他情况下退出。
所以这是我想出的一个过于简化的版本。
在类(class)层面:
private static volatile boolean keepRunning = true;
static {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
keepRunning = false;
}
});
}
然后是循环:
while(keepRunning) {
try {
// Do something useful
Thread.sleep(10000); // just an example of something that can cause InterruptedException
}
catch(InterruptedException e) {
keepRunning = false;
}
catch(Exception e) { // catches all exceptions, but not any errors
// log it
// reset state
}
}
if(!keepRunning) {
// shut down gracefully
}
看起来满足了所有4个条件,但是有一些问题和不清楚的部分:
- (问题)捕获
异常
并且不做任何事情都是违反所有良好实践的。但在这种情况下可以接受吗,或者有更好的解决方案吗? - (问题)我需要做的就是捕获
Error
来满足条件#2吗?或者还有其他我应该注意的情况吗? - (不清楚)通常建议“正常关闭”代码在异常后进入
finally
部分,我真的不喜欢在循环后检查它(if(!keepRunning)
)。但在这种情况下,它似乎不适合finally
。有更好的方法吗? - (问题)此代码是为 Java 7 编写的。Java 8 会有什么改变/改进吗?
我会很高兴直接回答我的问题,或者指出不同的模式/解决方案。提前致谢。
最佳答案
在您的情况下捕获Exception
是可以的。
如果您运行测试,不捕获错误
是一个很好的做法。
finally
block 是您应该用来优雅关闭的东西,是的 - finally
block 中的 if
语句是必需的,而且通常是这样好的。
如果发生错误,您的 finally
block 仍然会执行,所以一切都很好。
此代码适用于 Java 7 和 Java 8
关于java - 防止 Java 中运行时异常退出循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35539531/