即使抛出新的 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;
}
}
89707 次浏览

是的。

参见 文件:

在以下情况下执行 finally 块 一直都是 Try 街区的出口。

例外:

注意: 如果在 try 时 JVM 退出 或 catch 代码正在执行 Finally 块可能无法执行。 类似地,如果执行 Try 或 catch 代码被中断或 被杀死,finally 块可能不会 即使应用程序作为 一切还在继续。

当 try 块退出 时,finally 块总是执行,除非在 try 或 catch 中有 System.exit (0)。

是的。除了调用 System.exit ()的情况外,finally块总是执行,因为它会停止 Java VM。

是的,最后的积木总是运行... 除了当:

  • 运行 try-catch-finally 块的线程被杀死或中断
  • 你用 System.exit(0);
  • 底层虚拟机以其他方式被销毁
  • 底层硬件在某种程度上无法使用

此外,如果 finally 块中的一个方法抛出一个未捕获的异常,那么之后将不执行任何异常(即异常将像在任何其他代码中一样抛出)。发生这种情况的一个非常常见的例子是 java.sql.Connection.close()

顺便说一句,我猜测您使用的代码示例只是一个示例,但是要注意将实际逻辑放在 finally 块中。Finally 块用于资源清理(关闭 DB 连接、释放文件句柄等) ,而不是用于必须运行的逻辑。如果必须在 try-catch 块之前运行,则远离可能引发异常的内容,因为您的意图在功能上几乎肯定是相同的。

最后总是被执行,不管你的情况是什么

  • Try-catch-finally 块

对于未检查的异常,java 不强制执行,错误处理。 这就是为什么,如果 finally 块中发生了未检查的异常,并且没有对其进行处理,那么在这个点(发生错误的地方)下面编写的代码将不会被执行。

因此,我建议始终处理所有的异常,可以选中或未选中。 这样,无论是否发生未检查的异常,都可以确保 finally 中的代码块也被执行。你有一个地方在子巢捕获和 终于来了块,以完成必要的工作。

最后,块始终执行。

public class ExceptionTest {


public static void someFunction(String input) throws Exception {
try {
if( input.equals("ABC") ) {
System.out.println("Matched");
}
} catch (Exception e) {
throw new Exception(e);
} finally {
System.out.println("Input Is "+input+" Finally Executed!!!");
}
}


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
System.out.println("********* Test with VALUE ********* ");
someFunction("ABC");
System.out.println("\r\n********* Test with NULL  ********* ");
someFunction(null);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

Java Try Catch Finally Block with Throw