防止在Java中退出运行时异常循环

基里尔S.

我有一项服务,并且我希望它具有以下行为:

  1. 如果服务收到InterruptedException或JVM关闭,则应尝试正常停止
  2. 如果发生“灾难性”事件,则该服务应退出
  3. 任何其他异常都应记录,状态应重置,循环应继续运行
  4. 在任何其他情况下都不应退出循环。

所以这是我想出的一个过于简化的版本。

在课堂上:

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
}

似乎满足所有四个条件,但是存在一些问题和不清楚的部分:

  1. (问题)捕捉Exception和不执行任何操作均违反所有良好做法。但是在这种情况下是可以接受的,还是有更好的解决方案?
  2. (问题)是否没有抓住Error我为满足条件#2所需要做的一切?还是我应该注意其他情况?
  3. (不清楚)通常,建议“finally异常关闭”代码在异常之后进入该节,而我真的不喜欢在循环(if(!keepRunning)之后检查它但是finally在这种情况下似乎不合适有更好的方法吗?
  4. (问题)此代码是为Java 7编写的。使用Java 8可以进行任何更改/改进吗?

我将很乐意直接回答我的问题,或获得指向不同模式/解决方案的指导。提前致谢。

克拉西米尔·斯托耶夫

可以根据Exception您的情况进行检查。

Error如果您运行测试,则不捕获是一种好习惯。

finally块是您用来正常关闭的工具,是的-iffinally块中语句是必需的,通常情况下还可以。

如果发生错误,您的finally块仍将执行,因此一切正常。

Java 7和Java 8都可以使用此代码

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

什么时候抛出运行时异常?

来自分类Dev

如何使@NotNull抛出运行时异常?

来自分类Dev

有什么需要抛出运行时异常

来自分类Dev

如何使@NotNull抛出运行时异常?

来自分类Dev

在android中给出运行时短信权限错误

来自分类Dev

Java的8个流,如何减少或收“破发”,没有抛出运行时异常?

来自分类Dev

cout给出运行时错误

来自分类Dev

聚合Java 8流中的运行时异常

来自分类Dev

尝试使用Swift模拟C联合会给出运行时异常

来自分类Dev

Java Jar地狱运行时异常

来自分类Dev

当脚本在不同会话中同时运行时,从while循环退出不正确

来自分类Dev

Android中SQLite的运行时异常

来自分类Dev

Android中运行时的Nullpointer异常

来自分类Dev

动态片段中的运行时异常

来自分类Dev

C中的while循环在Repl.it中退出,但在使用gcc在本地运行时不退出

来自分类Dev

Java:我可以在运行时将运行时异常注入到任意类方法中吗?

来自分类Dev

防止摘要循环按角度运行时单击按钮

来自分类Dev

设置iDoc = IE.Document在VBA中给出运行时错误

来自分类Dev

构建通用应用的发行版时,为什么我的Xamarin PCL会抛出运行时异常?

来自分类Dev

为什么会出现这种使用泛型不会抛出运行时或编译时的异常?

来自分类Dev

Python代码抛出运行时错误NZEC?

来自分类Dev

va_arg给出运行时错误

来自分类Dev

flask sqlalchemy filter_by给出运行时错误

来自分类Dev

opencv linemod抛出运行时错误

来自分类Dev

performSegueWithIdentifier给出运行时错误,为什么?

来自分类Dev

为什么我的代码给出运行时错误?

来自分类Dev

堆栈溢出运行时错误C ++

来自分类Dev

在线判断给出运行时错误(NZEC)

来自分类Dev

以下代码在 ideone 中给出运行时错误,但在 eclipse 和 bash 终端中运行良好

Related 相关文章

  1. 1

    什么时候抛出运行时异常?

  2. 2

    如何使@NotNull抛出运行时异常?

  3. 3

    有什么需要抛出运行时异常

  4. 4

    如何使@NotNull抛出运行时异常?

  5. 5

    在android中给出运行时短信权限错误

  6. 6

    Java的8个流,如何减少或收“破发”,没有抛出运行时异常?

  7. 7

    cout给出运行时错误

  8. 8

    聚合Java 8流中的运行时异常

  9. 9

    尝试使用Swift模拟C联合会给出运行时异常

  10. 10

    Java Jar地狱运行时异常

  11. 11

    当脚本在不同会话中同时运行时,从while循环退出不正确

  12. 12

    Android中SQLite的运行时异常

  13. 13

    Android中运行时的Nullpointer异常

  14. 14

    动态片段中的运行时异常

  15. 15

    C中的while循环在Repl.it中退出,但在使用gcc在本地运行时不退出

  16. 16

    Java:我可以在运行时将运行时异常注入到任意类方法中吗?

  17. 17

    防止摘要循环按角度运行时单击按钮

  18. 18

    设置iDoc = IE.Document在VBA中给出运行时错误

  19. 19

    构建通用应用的发行版时,为什么我的Xamarin PCL会抛出运行时异常?

  20. 20

    为什么会出现这种使用泛型不会抛出运行时或编译时的异常?

  21. 21

    Python代码抛出运行时错误NZEC?

  22. 22

    va_arg给出运行时错误

  23. 23

    flask sqlalchemy filter_by给出运行时错误

  24. 24

    opencv linemod抛出运行时错误

  25. 25

    performSegueWithIdentifier给出运行时错误,为什么?

  26. 26

    为什么我的代码给出运行时错误?

  27. 27

    堆栈溢出运行时错误C ++

  28. 28

    在线判断给出运行时错误(NZEC)

  29. 29

    以下代码在 ideone 中给出运行时错误,但在 eclipse 和 bash 终端中运行良好

热门标签

归档