A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

21 个回复

倒序浏览
本帖最后由 阿苏勒 于 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. }

复制代码



评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报

finally中的代码需要先执行  而 return  等同于函数结束  所以 try中的语句 不被执行
回复 使用道具 举报
当try和finally代码块中都有return语句时,先执行try中的非return语句,执行到return语句时,直接跳过try中的return语句,执行finally中的语句。
回复 使用道具 举报
再补充下!return语句执行完,该方法执行结束,但是finally代码块石必须执行的。故,在该方法执行结束前,即执行return语句前必须先执行finally代码块。不过由于finally代码块中也有return语句,也就是说fianlly中return语句先执行,执行后该方法结束,就不会再去执行try代码块中的return语句啦!希望
回复 使用道具 举报
看答案来了,学习了。
回复 使用道具 举报
边逛论坛,;P边学习了.......
回复 使用道具 举报
一个函数只能return一次 函数就结束了
finally 中的语句优先所有语句 所以他先执行return语句, try中得return语句就没机会执行,也可以说被隐藏了
回复 使用道具 举报
同问啊,我也蒙了!
回复 使用道具 举报
return代表函数结束,但finally语句块必须要执行,所以遇到try语句块的return,程序会自动选择先去执行finally语句块,如果finally语句块有return语句则不会再执行try语句块的return

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
你的代码碰到第一个return的时候,就已经返回了,finally是在函数没有return的情况下才会必执行
回复 使用道具 举报
阿苏勒 发表于 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里面的啊!
回复 使用道具 举报
  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
回复 使用道具 举报
通过以上可以看出;读到return a语句时就跳出try执行finally,然后再执行try中return a,如果finally中有return b,则return b执行并结束。     在这里我就有另一个疑问,一个函数执行是否只能返回一个值呢?
回复 使用道具 举报
我觉得这是个语句执行优先级的问题
在这个函数里你要看先执行哪个,执行到try里面的return的时候jvm会判断是否有finally语句,如果有就先执行finally里面的语句,执行到finally里的return就直接返回值。完事了
回复 使用道具 举报
都被人家回答完了。。。。
回复 使用道具 举报
学习了
回复 使用道具 举报
一个方法中,不管是什么代码块只要执行到了return语句方法就结束,所以不会执行另外那个语句了
回复 使用道具 举报
其实是这样的,程序的流程是先执行try
然后,执行finally。因为try里面由return语句,所以会返回一个值,
但是,注意:这个返回值并不是马上就返回的,而是会暂时存放在内存中的某个地方(到底哪里我也不记得了)
然后,就会去执行finally里面的代码。
因为,这时finally里面也有一个return语句,所以它也要返回一个值,这时,finally里面的return的值就会
把前面的return 的值覆盖。
所以,最后返回的是finally里面的return的值,而不是try里面的return的值。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马