作为java程序员,try -catch-finally 这三个是组合是再常见不过了。但如果没有用好这对搭档的话,会出现很多意外的问题。
例一:
这个程序会是什么结果呢? i是0还是1:可以思考一下
运行结果是:
try
finally
1
原因,但使用javac进行编译的时候,会对代码进行优化
仔细观察上面优化后的代码是不是把try里面的return给去掉的,jvm认为finally中有return ,而且在执行try代码块的return之前一定会执行finally,那干脆把try中的return给去掉,所以返回的是2
例二:
这个程序会是什么结果呢? i是0还是1:继续思考
运行结果是:
try
finally
0
原因,同样jvm会对代码进行优化
这个时候finally中没有return,优化的规则有变了 ,jvm知道正常情况下执行try块的return之前一定要执行finally(finally并没有return) ,以防try执行return值之前被finally中的程序改变值。程序非常聪明,这个时候会多出一个临时变量j,看以上代码执行过程都能明白try返回的是j的值,finally中的i++对返回值并没有影响。
总结:平时写代码既不要在try中return,也不要在finally中return,正确的的应该只在方法末尾return