在这段代码中,即使执行 catch 块并抛出第二个 Exception,也会设置 someVar吗?
someVar
public void someFunction() throws Exception { try { //CODE HERE } catch (Exception e) { Log.e(TAG, "", e); throw new Exception(e); } finally { this.someVar= true; } }
是的。
参见 文件:
在以下情况下执行 finally 块 一直都是 Try 街区的出口。
例外:
注意: 如果在 try 时 JVM 退出 或 catch 代码正在执行 Finally 块可能无法执行。 类似地,如果执行 Try 或 catch 代码被中断或 被杀死,finally 块可能不会 即使应用程序作为 一切还在继续。
当 try 块退出 时,finally 块总是执行,除非在 try 或 catch 中有 System.exit (0)。
是的。除了调用 System.exit ()的情况外,finally块总是执行,因为它会停止 Java VM。
finally
是的,最后的积木总是运行... 除了当:
System.exit(0);
此外,如果 finally 块中的一个方法抛出一个未捕获的异常,那么之后将不执行任何异常(即异常将像在任何其他代码中一样抛出)。发生这种情况的一个非常常见的例子是 java.sql.Connection.close()。
java.sql.Connection.close()
顺便说一句,我猜测您使用的代码示例只是一个示例,但是要注意将实际逻辑放在 finally 块中。Finally 块用于资源清理(关闭 DB 连接、释放文件句柄等) ,而不是用于必须运行的逻辑。如果必须在 try-catch 块之前运行,则远离可能引发异常的内容,因为您的意图在功能上几乎肯定是相同的。
最后总是被执行,不管你的情况是什么
对于未检查的异常,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(); } }
}