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