女朋友:“你知道你错哪了吗?”
看到这个问题,你心里是不是“咯噔”一下,脑子里飞速回忆着自己哪里做错了?
是不是感觉自己要凉了?
在这里,我可以郑重地告诉你,你可能真的要凉了,因为你想不起来自己哪里错了。
如果你想要有有错立马知道的本事,建议大家给自己植入一段try-catch块。
作为一名程序猿,try-catch绝对是自己忠心的伙伴,我们不必抓耳挠腮去挨个寻错,只要你犯错了,立马就会被catch住。
怎么使用呢?这可太简单啦,网上一搜一大把。
咱们今天的主菜可不是教大家怎么用try-catch,而是谈一谈try-catch与return的秘事~~
具体是什么呢?
且看本帅博主给你娓娓道来。
首先看一段程序
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(test());
}
public static String test(){
try{
System.out.println("1");
Integer j=Integer.parseInt("Searchin");
}
catch(Exception e)
{
System.out.println("2");
return "由catch返回";
}
finally{
System.out.println("3");
return "由finally返回" ;
}
}
大家觉得这段程序的接口将会是什么呢?
运行结果如下:
从上图我们可以看到,最后程序是在finally块中return的。
为什么会这样呢?
明明在catch块里面也有return语句,怎么就不执行catch里面的语句呢?
莫非其中还有什么隐情不成?
我们再试试别的看看。
public static String test(){
try{
System.out.println("1");
return "try";
}
catch(Exception e)
{
System.out.println("2");
return "由catch返回";
}
finally{
System.out.println("3");
return "由finally返回" ;
}
}
这回我们把try里面的“Integer j=Integer.parseInt("Searchin");”语句删去,这样就不会进入catch块里面。
那么这样的话,程序会由哪里return呢?
我们运行一下看看。
哎呦?居然还是从finally返回的!
这时候我们可能会意识到一个问题:“finally在任何情况下是否都会执行?”
我们知道,在try-catch的使用中,不论是否有异常,finally都一定会执行。
但理论上来说,按照return的尿性,上文中的try中的return应该会执行,执行完之后就不再继续向下运行了。
那么整理一下疑点:
- try中的return执行了吗?
- 上文中的反常现象,是否与try-catch语句块的执行机制有关呢?
先解决一下第一个疑点:try中的return执行了吗?
我们用下面的代码试试看。
public static String test(){
try{
System.out.println("1");
return get1();
}
catch(Exception e)
{
System.out.println("2");
return "由catch返回";
}
finally{
System.out.println("3");
return "由finally返回" ;
}
}
public static void get1() {
System.out.println("调用get1");
}
上文中的代码借用get1()方法,输出语句,从而判断try中return是否执行。
我们来看看结果。
显然,try中的return执行了。
那么接下来解决第二个疑点:出现这样反常的现象,是否与它们的执行机制有关呢?
这个问题我们就需要向官方求助了。
官方的jvm规范中有如下说明:
If the try clause executes a return, the compiled code does the following: Saves the return value (if any) in a local variable. Executes a jsr to the code for the finally clause. Upon return from the finally clause, returns the value saved in the local variable. 如果try语句里有return,那么代码的行为如下: 1.如果有返回值,就把返回值保存到局部变量中 2.执行jsr指令跳到finally语句里执行 3.执行完finally语句后,返回之前保存在局部变量表里的值 |
这是什么意思呢?
也就是说,我们上文中的代码中的return的确是执行了,但是它里面的return中的返回值被保存为局部变量,之后再跳转到finally语句执行,之后再返回保存在局部变量表中的值。
至于返回值为什么不是try中的语句而是finally中的语句,是执行顺序导致的。
因此看起来似乎只是执行了finally中的return,但实际上人try和finally的return都执行了。
总结:在java的语言规范有讲到,如果在try语句里有return语句,finally语句还是会执行。它会在把控制权转移到该方法的调用者或者构造器前执行finally语句。也就是说,使用return语句把控制权转移给其他的方法前会执行finally语句。
提醒:在finally中写return语句并不是一个好的习惯,不建议使用。
好啦,以上就是try-catch语句中使用return的注意事项的相关总结,如果大家有什么更具体的发现或者发现文中有描述错误的地方,欢迎留言评论,我们一起学习呀~~
Biu~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~pia!