Java——try-catch语句块中使用return的注意事项

女朋友:“你知道你错哪了吗?”

看到这个问题,你心里是不是“咯噔”一下,脑子里飞速回忆着自己哪里做错了? 

是不是感觉自己要凉了?

在这里,我可以郑重地告诉你,你可能真的要凉了,因为你想不起来自己哪里错了。

如果你想要有有错立马知道的本事,建议大家给自己植入一段try-catch块。

作为一名程序猿,try-catch绝对是自己忠心的伙伴,我们不必抓耳挠腮去挨个寻错,只要你犯错了,立马就会被catch住。

怎么使用呢?这可太简单啦,网上一搜一大把。

咱们今天的主菜可不是教大家怎么用try-catch,而是谈一谈try-catch与return的秘事~~

具体是什么呢?

且看本帅博主给你娓娓道来。

首先看一段程序

扫描二维码关注公众号,回复: 4326199 查看本文章
	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~~~~~~~~~~~~~~~~~~~~宫å´éªé¾ç«è¡¨æå|é¾ç«gifå¾è¡¨æåä¸è½½å¾ç~~~~~~~~~~~~~~~~~~~~~~pia!

猜你喜欢

转载自blog.csdn.net/Searchin_R/article/details/84543401