Java基础:理解try...catch...finally的使用
try...catch...finally
基本大家都会用,也很少出问题,但当 try 语句块里增加存在return
或System.exit()
时会怎么处理,可能就有些疑惑和不确定了,下面来演示下这两种情况。
try 里面有return
当try...catch...finally
中有return
语句里,走到return语句会执行计算,但值的返回操作是最后执行,即在finally执行完后,再回到return语句直接将前面计算的值返回。(可以通过查看字节码执行顺序了解)
一道面试题:在try
时里有个return
语句,程序会怎么走,返回值是多少?
1 | public class TryCatchFinally { |
返回的结果是:AB2
,为什么不是ABC3
?
打断点分析,finally
执行完后,不是继续往下走,而是回到return
语句就直接返回了值,程序结束。
- 根据官方解释:
当try
语句中有return
语句时,编译会作如下处理:- 将 return 的返回值保存到局部变量。(个人理解:不管finally里对该值做任何改变,返回值都不会被改变,也就是说返值在finally运算之前就确定的。)
- 执行
jsr
指令执行finally。 - finally执行完后,返回return语句前面已经保存到局部变量的值,程序结束。
- finally后面语句不会执行。
- 示例代码解释
return ++x
,x = 2 , 把值保存到局部变量中;finally ++x
执行完后,x = 3;- 返回到
return
语句保存到局部变量里的值,即返回的是值是2
。
finally 里面有 return
- try和catch里面的return会被截断finally截断。
- 进入finally 执行到 return返回值。整个方法结束。
不会再跳回到try和catch里面的return执行。
使用建议
- finally 中最好不要有 return ,也没必要。
- 不要在 finally 中抛出异常, 不要在 finally 中做业务处理,finally 通常用于资源释放。
- 尽量不要在
try...catch...finally
中使用 return,return 语句写在方法最后面。
如果有,程序会提前结束,try...catch
的 return 会跳过,finally 后面的语句也不会执行。编译器会把finally中的return标识为warning
。
System.exit(0)
只要执行到System.exit(0)
语句,就程序结束,不管是在try...catch...finally
哪个位置。
Java基础:理解try...catch...finally的使用
http://blog.gxitsky.com/2018/03/25/Java-jdk-5-try-catch-finally/