我有一个内部返回的尝试/捕获。finally 块会执行吗?
try {
something();
return success;
}
catch (Exception e) {
return failure;
}
finally {
System.out.println("No se si esto se va a imprimir.");
}
我知道我可以写这个看看会发生什么(这真的是我要做的)但是当我用谷歌搜索它时,什么都没有出现,所以我在这里问了这个问题。
这是一个从英文原文翻译的问题,并根据它在我的计算机上给出的结果进行了调整:最终总是在 Java 中执行吗?强尼五
最后会被调用。
最终不会执行的唯一时间是:
这个答案是jodonnell的英文原文的翻译
2015 年 2 月 12 日编辑:考虑如果运行函数的线程被中断,finally 块是否会执行?通过Subhrajyoti Majumder
一个基于java原理的很简单的问题,finally块总会被调用。
只要被注释掉,就说明你完成了代码的执行或者有错误。
更多信息:Finally 块
不总是
Java 语言规范在第14.20.2节中描述了 try-catch-finally 和 try-finally 块的工作方式。
它没有指定始终执行 finally。
但它确实指定了对于 try-catch-finally 或 try-finally 块必须在 finally 块执行之前完成的所有情况。
即。如果SIG是在 try-catch-finally 或 try-finally 块之后执行的内容,而FIN是 finally 内部的内容,则 JLS 保证FIN始终在SIG执行之前执行。
为什么 JLS 不保证 finally 块总是在 try 块之后执行?因为这是不可能的。在 try 块完成后和 finally 块执行之前,虚拟机不太可能但有可能中止(杀死、崩溃、关闭计算机)。语言规范无法避免这种情况。
正如Java文档
try / catch
finally
所说,它总是在一个块内执行:注意:如果在执行 try 或 catch 代码时 JVM 退出,则 finally 块无法执行。同样,如果执行代码的线程
try
被catch
中断或杀死,即使应用程序作为一个整体继续,finally 块也无法执行。从 Java SE 7 开始,它“终于”失去了知名度
在 Java SE 7 之前,您可以实现将
finally
用作防止资源泄漏的关键工具。关闭文件或获取资源时,建议将代码放在一个块finally
中,以确保始终获取或关闭资源。由于它
finally
总是执行,无论语句是try
正常完成还是突然完成,它finally
是确保最终 关闭资源的唯一可能选项。我们在以下示例中看到了这一点:
在 Java 7 之前
finally
,它帮助我们清除了所有开放资源。从 Java 7 开始,已经实现了 try-with-resources 语句。
该语句
try-with-resources
是try
声明一个或多个资源的语句。资源是程序完成后必须关闭的对象。try-with-resources 语句确保每个资源在语句结束时关闭。任何实现的对象,java.lang.AutoCloseable
包括所有实现的对象java.io.Closeable
,都可以用作资源。以下示例从文件中读取第一行。使用 的实例
BufferedReader
从文件中读取数据。BufferedReader
是程序结束后应该关闭的资源:在此示例中,语句中声明的资源
try-with-resources
是BufferedReader
. 声明语句紧跟关键字后出现在括号中try
。Java SE 7 及更高版本中的类BufferedReader
实现了接口java.lang.AutoCloseable
。由于实例BufferedReader
是在 statement 中声明的,因此无论 try 语句是正常完成还是突然完成(作为方法抛出 a的结果)try-with-resources
,它都会退出。BufferedReader.readLine
IOException