常见的Try-Catch-Finally的执行次序: 如下面这片代码
InputStream in = new FileInputStream(. . .); try { // 1 code that might throw exceptions // 2 } catch (IOException e) { // 3 show error message // 4 } finally { // 5 in.close(); } // 6如果出现异常,则会按着1-2-3-4-5-6执行
如果没有异常或是捕获的异常类型不对,便会按着1-2-5-6进行执行
如果finally之前发生过异常并且在catch语句中被处理完且没有抛出新的异常,那么finally之后的语句会正常执行。
如果在catch或者finally中又产生了新的异常且没有被处理,那么finally之后的语句就不会执行了。
那么对于一些特殊的情况呢?
比如在try{}语句中直接return了,常规理解是return后变直接跳出方法,但是我们实际编程去看
public static void main(String[] args) { System.out.println(test()); } public static int test() { try { return 0; } finally { System.out.println("finally."); } }这个会输出什么?
finally. 0可以看出return先执行,但是并没有真正的退出函数,而是先把值存储起来, 执行完finally之后再取出来作为返回值,所以说何如果try或者catch中存在return语句,finally中的语句还是会执行
catch或者finally中又产生了新的异常且没有被处理,那么finally之后的语句就不会执行
不过如果在try()中添加异常,是不可能跳过finally的
如果我们非得不运行finally
在下面try{}中…包含什么代码的时候,程序才不会打印出finally?
try { ... } catch(Exception e) { System.out.println("catch"); } finally { System.out.println("finally"); }答案:
System.exit(0);如果不允许抛出新的异常的话,可以看到只有程序退出才能避免走到finally,否则无论出现什么样的情况都要执行finally