在这段代码中,即使执行catch块并抛出第二个异常,也会设置someVar
吗?
public void someFunction() throws Exception {
try {
//CODE HERE
} catch (Exception e) {
Log.e(TAG, "", e);
throw new Exception(e);
} finally {
this.someVar= true;
}
}
答案 0 :(得分:160)
是的,finally块总是运行...除非:
System.exit(0);
此外,如果finally块中的方法抛出未捕获的异常,则之后不会执行任何操作(即异常将像在任何其他代码中一样抛出)。发生这种情况的一个非常常见的情况是java.sql.Connection.close()
。
顺便说一下,我猜你所使用的代码示例只是一个例子,但要注意将实际逻辑放在finally块中。 finally块用于资源清理(关闭数据库连接,释放文件句柄等),而不是必须运行的逻辑。如果必须在try-catch块之前运行它,远离可能抛出异常的东西,因为你的意图几乎肯定在功能上是相同的。
答案 1 :(得分:9)
是。
请参阅documentation:
finally块总是执行时 try块退出。
例外:
注意:如果JVM在尝试时退出 或者正在执行catch代码 finally块可能无法执行。 同样,如果线程执行 尝试或捕获代码被中断或 杀了,终于阻止了 即使应用程序执行也执行 整体还在继续。
答案 2 :(得分:1)
The finally block always executes when the try block exits。除非你的try或catch中有System.exit(0)。
答案 3 :(得分:1)
是。 finally
块始终执行,除非您调用System.exit(),因为它会停止Java VM。
答案 4 :(得分:0)
无论你的情况如何,最后总是被执行,即
对于未经检查的异常,java不强制执行错误处理。 这就是原因,如果在finally块中发生了未经检查的异常然后没有对此进行处理,则不会执行此点(发生错误)之下的代码。
所以我建议总是处理所有可能被检查或取消选中的异常。 这样,无论是否还发生未经检查的异常,您都可以确保最终的代码块也被执行。你在sub nest catch中占有一席之地,最后阻止你完成必要的工作。
答案 5 :(得分:0)
最后,块总是执行。
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();
}
}
}