#finally
- 在异常处理时提供 finally 块来执行任何清除操作。只有在与 finally 相对应的 try 语句块得到执行的情况下,finally 语句块才会执行。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
-
finally 语句块可能是要执行的。
- 当try流程中出现程序中断情况是不会在执行finally语句的。也就是说一个线程在执行 try 语句块或者 catch 语句块时被打断(interrupted)或者被终止(killed),与其相对应的 finally 语句块可能不会执行。还有更极端的情况,就是在线程运行 try 语句块或者 catch 语句块时,突然死机或者断电,finally 语句块肯定不会执行了。
-
finally 对应的try catch语句中出现控制转移语句会咋样?
public static void main(String[] args) { try { System.out.println("try block"); return ; } finally { System.out.println("finally block"); } } //运行结果 //try block //finally block
从结果看finally语句会在return之前执行。
public static void main(String[] args) { System.out.println("return value of test(): " + test()); }public static int test() { int i = 1; try { System.out.println("try block"); i = 1 / 0; //抛一个异常进catch return i; }catch (Exception e){ System.out.println("exception block"); return 2; }finally { System.out.println("finally block"); } } //运行结果//try block//exception block//finally block//return value of test(): 2
从结果看finally 语句块在 catch 语句块中的 return 语句之前执行。
public static void main(String[] args) { System.out.println("return value of test(): " + test()); }@SuppressWarnings("finally")public static int test() { int i = 1; try { i = 4; return i; } finally { i++; return i; } } //运行结果//return value of test(): 5
从结果看 finally 语句块中如果出现return那么该流程就结束了。其实是finally块中的return语句会覆盖try块中的return返回。
public static void main(String[] args) { System.out.println("return value of test3(): " + test()); } public static int test3() { int b = 20; try { System.out.println("try block"); b += 80; return b; } catch (Exception e) { System.out.println("catch block"); } finally { System.out.println("finally block"); if (b > 25) { b += 100; System.out.println("b>25 and b = " + b); } } return b; } // 运行结果//try block//finally block//b>25 and b = 200//return value of test(): 100
从结果看:weary:为什么不返回200!为什么finally里面的修改没有效果?因为finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变。那什么情况下会改变呢?
public static void main(String[] args) { System.out.println("return value of test3(): " + test()); } public static int test3() { int b = 20; try { System.out.println("try block"); b += 80; b = b / 0; //抛异常 return b; } catch (Exception e) { System.out.println("catch block"); } finally { System.out.println("finally block"); if (b > 25) { b += 100; System.out.println("b>25 and b = " + b); } } return b; } //运行结果 //try block //catch block //finally block //b>25 and b = 200 //return value of test(): 200
从结果看finally里面的修改启效果了,因为抛出了异常所以没有执行try代码块里面的return。
public static void main(String[] args) { System.out.println("return value of test3(): " + test()); } public static int test3() { int b = 20; try { System.out.println("try block"); b += 80; b = b / 0; return b; } catch (Exception e) { System.out.println("catch block"); return b += 10; } finally { System.out.println("finally block"); if (b > 25) { b += 100; System.out.println("b>25 and b = " + b); } } }// 运行结果// try block// catch block// finally block// b>25 and b = 210// return value of test(): 110
-
从结果来看,抛出异常后return 方法执行之前,也运行了finally代码块,但是并未影响catch代码块中的返回值。
- 总结下:finally块的语句在try或catch中的return语句执行之后返回之前执行,且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。最后没有进入try代码块就不会执行finally代码块。。