【问题标题】:Java - Will try-with-resources call .close() if the user closes the program unexpectedly? [duplicate]Java - 如果用户意外关闭程序,try-with-resources 会调用 .close() 吗? [复制]
【发布时间】:2015-07-11 15:44:02
【问题描述】:

我正在为我正在开发的程序编写一些服务器代码,并且我正在使用 try-with-resource 语句来关闭套接字。

try (
            ServerSocket serverSocket = new ServerSocket(port);
            Socket clientSocket = serverSocket.accept();

            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        ) {


        out.println("This is the server! Hooray! :D");


    } catch (IOException e) {
        e.printStackTrace();
        System.exit(-1);
    }

问题是,如果用户决定在 try 块完成之前关闭程序怎么办? .close() 方法会被调用吗?

这是在 oracle 的网站上:it will be closed regardless of whether the try statement completes normally or abruptly 但我不确定这是否包括用户是在尝试完成之前关闭程序还是程序崩溃。

谢谢。

【问题讨论】:

    标签: java sockets resources try-catch


    【解决方案1】:

    是/否,

    “try-with-resources 语句确保每个资源在语句结束时关闭”

    这可以在Oracle找到

    只要把它想象成一个 finally 块。 finally 将始终被执行。

    "注意:如果JVM在try或catch代码执行过程中退出,则finally块可能不会执行。同样,如果执行try或catch代码的线程被中断或杀死,finally块可能不会执行即使整个应用程序仍在继续。”

    这可以在Oracle找到

    【讨论】:

      【解决方案2】:

      不,它不会。

      Runtime.addShutdownHook 在您需要时提供更多保证,但仍然不是 100%,因为如果 JVM 崩溃/有人从外部强行终止 JVM,它将不会被调用。

      最好的解决方案是让包装进程启动您的 Java 应用程序,监视它并在被监视的进程终止时执行您需要的操作。

      【讨论】:

        【解决方案3】:

        如果我正确理解您的问题,我认为它不会关闭。 try 块必须优雅地完成或捕获一些异常才能关闭资源。所以它应该是一个检查异常。我相信如果您在尝试使用资源时捕获 RuntimeException,那么该资源将被关闭。但它不会关闭带有线程的资源或 JVM 因 OOM 等问题而崩溃。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-04
          • 2019-03-12
          • 2013-06-30
          • 1970-01-01
          • 2020-04-30
          • 2017-05-06
          相关资源
          最近更新 更多