finally 子句(clause)是不是总会执行???
package com.volshell.test; public class Main { public static void main(String[] args) { change1(10); } private static void change1(int word) { System.out.println("测试结果:" + test(1)); } private static int test(int i) { if (i == 1) return 0; System.out.println("将要进入try块"); try { System.out.println("try block"); return 3; } catch (Exception e) { // TODO: handle exception } finally { System.out.println("finally"); i++; return i; } } }上面结果为 测试结果:0
第一条:如果没有进入try中,是不会执行finally子句的。
1 package com.volshell.test; 2 3 public class Main { 4 public static void main(String[] args) { 5 change1(10); 6 } 7 8 private static void change1(int word) { 9 System.out.println("测试结果:" + test(1)); 10 } 11 12 private static int test(int i) { 13 // if (i == 1) 14 // return 0; 15 System.out.println("将要进入try块"); 16 try { 17 System.out.println("try block"); 18 System.exit(0); 19 return 3; 20 } catch (Exception e) { 21 // TODO: handle exception 22 } finally { 23 System.out.println("finally"); 24 i++; 25 return i; 26 } 27 } 28 }
测试结果:将要进入try块 try block这次同样没有进入finally中。因为在try中调用了System.exit(0);
第二条:当一个线程正在执行try语句块或者catch语句块的时候,突然被打断或者终止,那么相应的finally是不会被执行的。
***********************************************************************************************************
The finally BlockThe finally block always executes when the try block exits. This ensures that the finallyblock is executed even if an unexpected exception occurs. But finally is useful formore than just exception handling — it allows the programmer to avoid having cleanupcode accidentally bypassed by a return,continue, or break. Putting cleanup code in afinally block is always a good practice, even when no exceptions are anticipated.Note: If the JVM exits while the try or catch code is being executed, then the finallyblock may not execute. Likewise, if the thread executing the try or catch code isinterrupted or killed, the finally block may not execute even though the applicationas a whole continues.
***************************************************************************************************************
关于try,catch,finally的执行顺序的问题:
***************************************************************************************************************
where either at least one catch clause, or the finally clause, must be present. 至少有一个catch或者finally子句。可以没有catch
The body of the try statement is executed until either an exception is thrown or the bodyfinishes successfully. ---异常抛出或者程序正确执行都会执行try.
If an exception is thrown, each catch clause is examined in turn,from first to last, to see whether the type of the exception object is assignable tothe type declared in the catch. When an assignable catch clause is found, its blockis executed with its identifier set to reference the exception object. No other catchclause will be executed. Any number of catch clauses, including zero, can be associatedwith a particular Try as long as each clause catches a different type of exception.If no appropriate catch is found, the exception percolates (渗透)out of the try statementinto any outer try that might have a catch clause to handle it.--如果没有找到合适的捕获,交由外面的捕获来处理。
If a finally clause is present with a try, its code is executed after all other processingin the try is complete. This happens no matter how completion was achieved, whethernormally, through an exception, or through a control flow statement such as return orbreak.只有处理完毕try中的语句(不包括异常语句,return语句,break语句)之后,才会执行finally全部子句(包括其中的return子句).
***************************************************************************************************************
第三条:只有处理完毕try中的语句(不包括异常语句,return语句,break语句)之后,才会执行finally全部子句(包括其中的return子句等)。处理完finally之后再返回去处理try中的剩余子句。
转载于:https://www.cnblogs.com/plxx/p/4641597.html