黑马程序员技术交流社区

标题: 函数里面有2个return,为什么只打印了一个值? [打印本页]

作者: 、海    时间: 2014-6-8 09:45
标题: 函数里面有2个return,为什么只打印了一个值?
public class Test3 {

        public static void main(String[] args) {
        System.out.println(Return());       

        }
        public static int Return(){
                int a = 1;
                int b =a+1;
                try {
                        return a;//第一个返回值a
                } finally {
                        return b;//第二个返回值b
                       
                }
               
               
               
        }

}

结果为2
作者: 阿苏勒    时间: 2014-6-8 09:55
本帖最后由 阿苏勒 于 2014-6-8 09:57 编辑

在执行try或catch代码块的return语句时,如果finally里面有return语句,会先执行finally代码块。
finally代码块的return语句会覆盖掉try或catch代码块的return语句。

说明代码
  1. public class FinallyReturn {
  2.   public int methodA(int money)throws SpecialException{
  3.     if(--money<=0) throw new SpecialException("Out of money");
  4.     return money;
  5.   }

  6.   public int methodB(int money){
  7.     try{
  8.       return methodA(money);  //可能抛出异常
  9.     }catch(SpecialException e){
  10.       return -100;
  11.     }finally{
  12.       return 100;  //会覆盖try和catch代码块的return语句
  13.     }
  14.   }

  15.   public static void main(String args[]){
  16.     FinallyReturn s=new FinallyReturn ();
  17.     System.out.println(s.methodB(1));  //打印100
  18.     System.out.println(s.methodB(2));  //打印100
  19.   }
  20. }

复制代码




作者: 艮昕辶    时间: 2014-6-8 10:07
return  等同于函数结束
程序会直接跳转到下一个语句
  1. public class Test3 {

  2.         public static void main(String[] args) {
  3.         System.out.println(Return());        
  4.         System.out.println("程序已经return会直接跳转到这里不会执行Return()中的finally语句");
  5.         }
  6.         public static int Return(){
  7.                 int a = 1;
  8.                 int b =a+1;
  9.                 try {
  10.                         return a;//第一个返回值a
  11.                 } finally {
  12.                         return b;//第二个返回值b
  13.                         
  14.                 }
  15.                
  16.                
  17.                
  18.         }

  19. }
复制代码

作者: 江祖贇    时间: 2014-6-8 10:49

finally中的代码需要先执行  而 return  等同于函数结束  所以 try中的语句 不被执行
作者: sun_jun    时间: 2014-6-8 12:08
当try和finally代码块中都有return语句时,先执行try中的非return语句,执行到return语句时,直接跳过try中的return语句,执行finally中的语句。
作者: sun_jun    时间: 2014-6-8 12:16
再补充下!return语句执行完,该方法执行结束,但是finally代码块石必须执行的。故,在该方法执行结束前,即执行return语句前必须先执行finally代码块。不过由于finally代码块中也有return语句,也就是说fianlly中return语句先执行,执行后该方法结束,就不会再去执行try代码块中的return语句啦!希望
作者: 123_yaya    时间: 2014-6-8 12:48
看答案来了,学习了。
作者: 18353666072    时间: 2014-6-8 13:02
边逛论坛,;P边学习了.......
作者: 倪大大    时间: 2014-6-8 13:33
一个函数只能return一次 函数就结束了
finally 中的语句优先所有语句 所以他先执行return语句, try中得return语句就没机会执行,也可以说被隐藏了
作者: wangkerui    时间: 2014-6-8 13:50
同问啊,我也蒙了!
作者: sam9204    时间: 2014-6-8 14:41
return代表函数结束,但finally语句块必须要执行,所以遇到try语句块的return,程序会自动选择先去执行finally语句块,如果finally语句块有return语句则不会再执行try语句块的return
作者: xp8812    时间: 2014-6-8 15:28
你的代码碰到第一个return的时候,就已经返回了,finally是在函数没有return的情况下才会必执行
作者: 、海    时间: 2014-6-8 17:39
阿苏勒 发表于 2014-6-8 09:55
在执行try或catch代码块的return语句时,如果finally里面有return语句,会先执行finally代码块。
finally代 ...
  1. public class Test3 {

  2.         public static void main(String[] args) {
  3.         System.out.println(Return());       

  4.         }
  5.         public static int Return(){
  6.                 int a = 1;
  7.                 int b=a+1;
  8.                 try {
  9.                         System.out.println("11");
  10.                         return a;
  11.                 } finally {
  12.                         return b;
  13.                        
  14.                 }
  15.                
  16.                
  17.                
  18.         }

  19. }
复制代码

打印结果
11
2

说明有执行try里面的啊!
作者: 、海    时间: 2014-6-8 17:47
  1. public class Test3 {

  2.         public static void main(String[] args) {
  3.         System.out.println(Return());        

  4.         }
  5.         public static int Return(){
  6.                 int a = 1;
  7.                 int b=a+1;
  8.                 try {
  9.                         System.out.println("执行try");
  10.                         return a;
  11.                 } finally {
  12.                         
  13.                         System.out.println("执行finally");
  14.                         
  15.                         
  16.                 }
  17.                
  18.                
  19.                
  20.         }

  21. }
复制代码

打印结果

执行try
执行finally
1

作者: 、海    时间: 2014-6-8 17:52
通过以上可以看出;读到return a语句时就跳出try执行finally,然后再执行try中return a,如果finally中有return b,则return b执行并结束。     在这里我就有另一个疑问,一个函数执行是否只能返回一个值呢?
作者: 丁绍然    时间: 2014-6-8 17:57
我觉得这是个语句执行优先级的问题
在这个函数里你要看先执行哪个,执行到try里面的return的时候jvm会判断是否有finally语句,如果有就先执行finally里面的语句,执行到finally里的return就直接返回值。完事了
作者: 小周务商    时间: 2014-6-8 18:11
都被人家回答完了。。。。
作者: Hi天天向上    时间: 2014-6-8 18:22
学习了

作者: Dr_manhattan    时间: 2014-6-8 21:10
一个方法中,不管是什么代码块只要执行到了return语句方法就结束,所以不会执行另外那个语句了
作者: 2528870651    时间: 2014-6-8 22:00
其实是这样的,程序的流程是先执行try
然后,执行finally。因为try里面由return语句,所以会返回一个值,
但是,注意:这个返回值并不是马上就返回的,而是会暂时存放在内存中的某个地方(到底哪里我也不记得了)
然后,就会去执行finally里面的代码。
因为,这时finally里面也有一个return语句,所以它也要返回一个值,这时,finally里面的return的值就会
把前面的return 的值覆盖。
所以,最后返回的是finally里面的return的值,而不是try里面的return的值。
作者: java木    时间: 2014-6-8 22:46
return 语句是一个函数的结束不假,但如果函数有finally语句块,那该方法就算执行到它也不会立即结束,会继续执行finally语句块的内容。finally也有return语句很显然,它覆盖了try语句里的retrun。
作者: 依然阿邦    时间: 2014-6-8 23:25
还没看到这:L




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2