编程爱好者联盟 2016-10-15
package test; public class TestFinally { public static void main(String[] args) { Demo demo=new Demo(); TestFinally tf=new TestFinally(); String result=tf.fun1(demo); System.out.println(result); System.out.println(demo.str); } private String fun1(Demo demo) { try { demo.str+="1"; return fun2(demo); }finally{ demo.str+="2"; } } private String fun2(Demo demo) { try { demo.str+="3"; return demo.str; }finally{ demo.str+="4"; } } } class Demo{ String str=""; }View Code
执行结果:
13
1342
我写的答案是result=1234 demo.str=1234。在我的记忆中finally是异常捕获关键词,finally代码块一定会执行。但我对其的执行过程并不十分清楚,以前一直认为一旦遇到return返回,即代表函数结束,则finally在return之前执行。所以写出了如上错误结果。而通过正确结果,可以看出,函数在return执行完毕后如果有finally代码块存在,就会在return执行完毕的基础上继续执行finally中的代码块。所以结果为result=12 demo.str=1324。
进一步的,那如果finally中也有return将怎么执行呢?
(1)
package test; public class TestFinally { public static void main(String[] args) { Demo demo=new Demo(); TestFinally tf=new TestFinally(); String result=tf.fun1(demo); System.out.println(result); System.out.println(demo.str); } private String fun1(Demo demo) { try { demo.str+="1"; return fun2(demo); }finally{ demo.str+="2"; } } private String fun2(Demo demo) { try { demo.str+="3"; return demo.str; }finally{ demo.str+="4"; return demo.str;//添加的return语句 } } } class Demo{ String str=""; }View Code
执行结果:
1341342
(2)
package test; public class TestFinally { public static void main(String[] args) { Demo demo=new Demo(); TestFinally tf=new TestFinally(); String result=tf.fun1(demo); System.out.println(result); System.out.println(demo.str); } private String fun1(Demo demo) { try { demo.str+="1"; return fun2(demo); }finally{ demo.str+="2"; return demo.str;//添加的return语句 } } private String fun2(Demo demo) { try { demo.str+="3"; return demo.str; }finally{ demo.str+="4"; } } } class Demo{ String str=""; }View Code
执行结果:
13421342
说明如果finally中也有return。则由于函数在return执行完毕后如果有finally代码块存在,就会在return执行完毕的基础上继续执行finally中的代码块,则finally中的return会覆盖try代码块中的return的结果。
theta = np.zeros #theta = array,构造全为零的行向量。grad[0,j] = np.sum/len #∑term / m. return value > threshol