return和finally

return和finally

老师,在4-10的代码里,try和catch、finally块里都写有return。我的问题是:

1、return,我记得在以前的学习里,一旦出现它,return所在的方法结束执行。按照我的理解,try和catch里执行了自己的对应的return,finally就不会被执行,为什么finally像是得了强迫症那样,一定会被执行呢?

2、是因为finally写有retrun,而finally是强迫症患者,必须得执行,所以才忽略了try和catch中的return吗?

3、return怎么知道要返回到int result=test();呢?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

方法执行时,会根据语句改变栈中的值。

当执行return语句时,值才会存入寄存器中。

当return语句在finally中时,a在栈中,寄存器中值都为2。

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 鱼儿0001 提问者 #1
    好的,谢谢老师!
    2019-06-12 19:29:55
好帮手慕小班 2019-06-09 18:16:16

同学你好,1、finally是与try-catch配合使用的哦!finally是无论try或catch执行或不执行都会执行finally中的内容!这是finally的特性,所以finally是一定会执行的哦!

2、并没有忽略try和catch中的return语句哦!例如:

public class java_try_catch {
         public static void main(String[] args){ 
             System.out.println(method()); } 
         public static int method(){ 
             int a = 1; 
             try{ 
                 throw new Exception(); 
             }catch(Exception e) {
                  System.out.println("catch : a = " + a);
                   return a; 
             }finally{ 
               a = 2; 
               System.out.println("finally : a = " + a); 
             } 
        } 
   }

最后的运行效果是:

http://img1.sycdn.imooc.com//climg/5cfcda010001c98403460097.jpg

这是因为变量 a 存放在栈中并赋值为1,try抛出异常,运行 catch 语句块。当运行到 return a 时,将 a 的值放入到寄存器,并执行 finally 语句块。而在 finally 中只是改变了栈中 a 的值,很显然寄存器中的值不会受到影响。因此,等 finally 语句块执行完后,主函数接收的是寄存器的值 1 。

可以参考如下图的理解:

http://img1.sycdn.imooc.com//climg/5cfcda7c0001737211030500.jpg

3、int result=test();中在主方法中调用test静态方法,而test方法是有返回值的,在try和catch中都有对应的return的返回值,所以调用test方法用result变量来接收返回值,所以是通过调用test方法来得到return的返回值,而不是return知道要返回到int result=test();这条语句中!

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~



  • 提问者 鱼儿0001 #1
    谢谢老师的耐心回复!关于我问的第二个问题,比较不好懂,所以每天将老师的回复看一遍,我终于找到自己困惑的地方了。形如老师所举例子,finally中a的值是2,最后return的还是1。可是,当finally里也有return a时,返回的就不是1了肯定是2,这时候栈与寄存器的数值是怎样的情况呢?
    2019-06-11 19:59:53
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师