即使你抛出一个新的exception,finally块是否会运行?
在这段代码中,即使catch块被执行,第二个exception被抛出, someVar
被设置。
public void someFunction() throws Exception { try { //CODE HERE } catch (Exception e) { Log.e(TAG, "", e); throw new Exception(e); } finally { this.someVar= true; } }
是的,终于块总是运行…除非:
- 运行try-catch-finally块的线程被终止或中断
- 您使用
System.exit(0);
- 底层虚拟机以其他方式被破坏
- 底层硬件在某种程度上是不可用的
另外,如果你的finally块中的方法抛出一个未捕获的exception,那么在这之后没有任何exception会被执行(即exception将被抛出,就像其他代码一样)。 发生这种情况的一个非常常见的情况是java.sql.Connection.close()
。
顺便说一下,我猜你所使用的代码示例仅仅是一个例子,但要注意将实际的逻辑放在finally块中。 finally块用于资源清理(closures数据库连接,释放文件句柄等),而不是用于必须运行的逻辑。 如果它必须在try-catch块之前执行,远离可能抛出exception的东西,因为你的意图在function上几乎是一样的。
是。
请参阅文档 :
finally块总是在try块退出时执行。
例外:
注意:如果JVM在try或catch代码执行时退出,那么finally块可能不会执行。 同样,如果执行try或catch代码的线程被中断或终止,即使应用程序整体继续,finally块也可能不会执行。
finally块总是在try块退出的时候执行 。在你的try或catch中你没有System.exit(0)。
是。 finally
阻止执行,除非你调用System.exit(),因为它阻止了Java虚拟机。
最后总是执行,不pipe你的情况是什么
- try-catch-finally块
- 投
对于未经检查的exception,java不会强制执行error handling。 这就是原因,如果在finally块中发生一个未经检查的exception,那么没有处理完成,那么写在这个点(发生错误)的代码将不会被执行。
所以我build议总是处理所有的exception,可能会被检查或取消选中。 这样你就可以确保在最后的代码块也被执行,不pipe是否还有未经检查的exception。 你有一个子巢捕捉的地方,并最终阻止完成你的必要工作。
- 检查在Python中打开了哪些文件
- java.lang.IllegalStateException:找不到工厂javax.faces.application.ApplicationFactory的备份
- Xcode 4.5破坏XIBs?
- 如何在exception情况下打印完整的堆栈跟踪?
- Java / Android的 – 如何打印出一个完整的堆栈跟踪?
- 如何避免NoRouteToHostException?
- slf4j:如何logging格式化的消息,对象数组,exception
- 不能用Directory.Delete删除目录(path,true)
- 线程忽略KeyboardInterruptexception