Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中防止在运行时异常时退出循环_Java_Exception_Design Patterns - Fatal编程技术网

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

在Java中防止在运行时异常时退出循环,java,exception,design-patterns,Java,Exception,Design Patterns,我有一个服务,我希望它具有以下行为: 如果服务接收到中断异常,或者JVM关闭,它应该尝试正常停止 如果发生“灾难性”事件,服务应该退出 应记录任何其他异常,状态应重置,循环应保持运行 循环在任何其他情况下都不应退出 这是我提出的一个过于简化的版本 在班级层面: private static volatile boolean keepRunning = true; static { Runtime.getRuntime().addShutdownHook(new Thread() {

我有一个服务,我希望它具有以下行为:

  • 如果服务接收到中断异常,或者JVM关闭,它应该尝试正常停止
  • 如果发生“灾难性”事件,服务应该退出
  • 应记录任何其他异常,状态应重置,循环应保持运行
  • 循环在任何其他情况下都不应退出
  • 这是我提出的一个过于简化的版本

    在班级层面:

    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个条件,但存在一些问题和不清楚的部分:

  • (问题)捕获
    异常
    而什么都不做是违反所有良好做法的。但在这种情况下,这是可以接受的,还是有更好的解决方案
  • (问题)捕获
    错误
    是否不满足条件2所需的全部操作?或者还有其他我应该注意的情况吗
  • (不清楚)通常建议“优雅地关闭”代码在异常之后进入
    finally
    部分,我不太喜欢在循环之后检查它(
    if(!keepRunning)
    )。但在这种情况下,它似乎不适合
    最终
    。有更好的方法吗
  • (问题)这段代码是为Java7编写的。Java 8会改变/改进什么

  • 我希望能直接回答我的问题,或者能指出不同的模式/解决方案。提前感谢。

    在您的情况下捕获
    异常是可以的

    如果您运行测试,不捕获
    错误是一个很好的做法

    finally
    块是您应该用来优雅地关闭的,是的,
    finally
    块中的
    if
    语句是必需的,并且通常是ok的

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


    这段代码对Java 7和Java 8都适用

    只有在杀死所有现有用户线程后才会调用关闭挂钩。