可以看到,就算catch中 return了,finally也会执行 。
那finally是在return前呢,还是return后呢?
让我们看下面的代码?
public class TryCatchFinallyDemo2 {public static void main(String[] args) {//test();System.out.println(test2()); // 我有执行到吗 trySystem.out.println(test3()); // 我有执行到吗 catch}public static String test3() {String str = "";try {str = "try";System.out.println(10 / 0);return str;}catch(Exception e) {str = "catch";return str;}finally {str = "finally";System.out.println("我有执行到吗");}}public static String test2() {String str = "";try {str = "try";return str;}catch(Exception e) {str = "catch";return str;}finally {str = "finally";System.out.println("我有执行到吗");}}}
运行结果:
我有执行到吗try我有执行到吗catch
看到这里发现无论是否异常,finally都会执行,但是都在在return之前就执行了代码 。可是可是,为什么返回出来的字符串不是finally呢?让我们一起来思考思考:
我们看test2()方法,程序执行try语句块,把变量str赋值为”try”,由于没有发现异常,接下来执行finally语句块,把变量str赋值为”finally”,然后return str,则t的值是finally,最后str的值就是”finally”,程序结果应该显示finally,但是实际结果为“try” 。实际上,在try语句的return块中,当我们执行到return str这一步的时候呢,这里不是return str 而是return “try”了,这个放回路径就已经形成了 。相当于return返回的引用变量(str是引用类型)并不是try语句外定义的引用变量str,而是系统重新定义了一个局部引用str2,返回指向了引用str2 对应的值,也就是”try”字符串 。但是到这里呢,它发现后面还有finally,所以继续执行finally的内容,str = “finally”; System.out.println(“我有执行到吗”);,再次回到以前的路径,继续走return “try”,形成返回路径之后,这里的return的返回引用就不是变量str 了,而是str2引用的值”try”字符串 。是不是对这个现象有了一定的了解 。嘿嘿,这里我们再转换下:
public class TryCatchFinallyDemo2 {public static void main(String[] args) {//test();//System.out.println(test2()); // try//System.out.println(test3()); // catchSystem.out.println(test4());}public static String test4() {String str = "";try {str = "try";return str;}catch(Exception e) {str = "catch";return str;}finally {str = "finally";return str;}}}
这里我们猜测下,结果是什么呢?
运行结果:finally
我们发现try语句中的return语句给忽略 。可能JVM认为一个方法里面有两个return语句并没有太大的意义,所以try中的return语句给忽略了,直接起作用的是最后finally中的return语句,就又重新形成了一条返回路径,所以这次返回的是“finally”字符串 。再看一下: 我们是不是知道finally语句是一定执行的,但是能有办法使他不执行吗?
推荐阅读
- 提莫西查拉梅为什么叫“甜茶”?
- “操”什么意思
- champion袖标有几种
- 清代小说<再生缘>陈端生原著 !谁能帮帮我,十分感谢
- 建国西路154号 问路,梅陇新村—>卢湾区业余大学
- “营改增”文化创意服务包括哪些?
- “ip电影”什么意思
- 黄渤将“佟丽娅”说成“佟娅丽”,是口误还是玩笑?
- “伯牙谓世再无知音,乃破琴绝弦,终身不复鼓。”的意思是什么
- “执念有尽,深爱无终。”这句话什么意思?