Java - 如果用户意外关闭程序,是否会尝试使用资源调用.close()?

时间:2015-05-01 18:49:36

标签: java sockets resources try-catch

我正在处理我正在开发的程序的一些服务器代码,并且我正在使用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但我不确定是否包括用户是否在尝试完成之前关闭程序,或者只是程序崩溃。

感谢。

3 个答案:

答案 0 :(得分:3)

是/否,

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

可以在Oracle

找到

只要把它想象成一个终极块。终于将永远执行。

"注意:如果在执行try或catch代码时JVM退出,则finally块可能不会执行。同样,如果执行try或catch代码的线程被中断或终止,即使应用程序作为一个整体继续,finally块也可能无法执行。"

可以在Oracle

找到

答案 1 :(得分:0)

不,不会。

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

最好的解决方案就是拥有启动Java应用程序的包装器进程,监视它并在监视进程终止时执行所需的操作。

答案 2 :(得分:0)

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