即使你抛出一个新的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。 你有一个子巢捕捉的地方,并最终阻止完成你的必要工作。