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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨华东 中级黑马   /  2012-10-10 00:46  /  4289 人查看  /  22 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨华东 于 2012-10-21 20:21 编辑
  1. public class smallT
  2. {
  3. public static void main(String args[])
  4. {
  5. smallT t = new smallT();
  6. int b = t.get();
  7. System.out.println(b);
  8. }

  9. public int get()
  10. {
  11. try
  12. {
  13. return 1 ;
  14. }
  15. finally
  16. {
  17. return 2 ;
  18. }
  19. }
  20. }
复制代码
结果为什么是:2???郁闷 求解答

评分

参与人数 1技术分 +1 收起 理由
尤圣回 + 1 神马都是浮云

查看全部评分

22 个回复

倒序浏览
因为 finally 一定要执行的

只有一种情况不会执行,当执行到System.exit(0)

评分

参与人数 1技术分 +1 收起 理由
尤圣回 + 1 赞一个!

查看全部评分

回复 使用道具 举报
我是菜鸟 发表于 2012-10-10 00:54
因为 finally 一定要执行的

只有一种情况不会执行,当执行到System.exit(0)

这个俺知道  求正解
回复 使用道具 举报
跳到get()方法执行 return 1;然后再继续执行return 2; 所以b就是2啊~~~
回复 使用道具 举报
给你打个比方,你在A地玩,正准备回家,结果你想起你去B地还有做点事,在B地做完事,由于特殊情况就直接从B地回家了,呵呵……娱乐下

评分

参与人数 1技术分 +1 收起 理由
尤圣回 + 1 赞一个!

查看全部评分

回复 使用道具 举报
形象啊      果然高手
回复 使用道具 举报
当finally中有return的时候,try里的return是不执行的。
因为try里遇到return的时候先不执行,这时finally先执行,如果没有return就执行try里的return,如果finally里有return就返回这个值,而不再执行try里的return。

评分

参与人数 1技术分 +1 收起 理由
尤圣回 + 1 赞一个!

查看全部评分

回复 使用道具 举报
翁鹏 高级黑马 2012-10-10 09:26:29
8#
不管前面有多少return,finally中的return将覆盖掉前面的return。
所以最好不要在finally中写return语句。

评分

参与人数 1技术分 +1 收起 理由
尤圣回 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 缘木求鱼 于 2012-10-10 10:14 编辑
  1. public class SmallT{
  2.   public static void main(String args[]){
  3.     SmallT t = new SmallT();
  4.     int b = t.get();
  5.     System.out.println(b);
  6.   }

  7.   public int get(){
  8.     try{
  9.       return 1 ;
  10.     }
  11.     finally{
  12.       try{
  13.         Thread.sleep(10000);
  14.         System.out.println("try is running");
  15.         //return 2 ;
  16.       }catch(Exception e){}
  17.     }
  18.   }
  19. }

  20. 运行结果:
  21. try is running
  22. 1
  23. 结果说明问题。

  24. finally语句优先于try语句执行。try语句的作用是检查其内的语句是否报错。若try、finally里面都有return,则执行
  25. finally里的,这可能跟虚拟机的机制有关。(按说ftry里的return后执行,不是应该覆盖掉finally里的return值吗?)
复制代码

评分

参与人数 1技术分 +1 收起 理由
尤圣回 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 qhasilver 于 2012-10-10 10:30 编辑
缘木求鱼 发表于 2012-10-10 10:08


给你讲个故事:
为了证明蜘蛛的听觉在腿上,科学家把蜘蛛放在桌子上,然后大叫一声,蜘蛛吓跑了。然后专家割掉了蜘蛛的全部腿,放在桌子上,大叫一声,蜘蛛没有吓跑,由此可见蜘蛛的听觉在腿上。。
  1. public class smallT

  2. {

  3. public static void main(String args[])

  4. {

  5. smallT t = new smallT();

  6. int b = t.get();

  7. System.out.println(b);

  8. }



  9. public int get()

  10. {

  11. try

  12. {
  13. System.out.println("dotry");
  14. return 1 ;

  15. }

  16. finally

  17. {
  18. try {
  19.   Thread.sleep(10000);
  20. } catch (InterruptedException e) {
  21.   e.printStackTrace();
  22. }
  23.         System.out.println("dofinally");
  24. return 2 ;

  25. }

  26. }

  27. }
  28. //输出结果:
  29. //dotry
  30. //dofinally
  31. //2
  32. //结论是try方法先执行了,finally方法中的return覆盖了之前的return值
复制代码

评分

参与人数 1技术分 +1 收起 理由
尤圣回 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 缘木求鱼 于 2012-10-10 11:34 编辑
qhasilver 发表于 2012-10-10 10:27
给你讲个故事:
为了证明蜘蛛的听觉在腿上,科学家把蜘蛛放在桌子上,然后大叫一声,蜘蛛吓跑了。然后专家 ...

讲故事都是有针对性的,看你怎么看待故事阿。我现在有点厌烦人们把花虫鸟兽思考的跟人似的,自私到了极致。
-------------------------------------
正题:但是从我的提供的程序来看的确是try语句后执行了,为什么try语句中的return没有覆盖掉finally语句中的return。反而是finally中的return“覆盖”了try中的return?请从原理上说服我,咋不是小孩拉{:soso_e129:}
回复 使用道具 举报
本帖最后由 zczcyc0201 于 2012-10-10 11:59 编辑

smallT t = new smallT();
建立了一个新的smallT()对象
新对象调用get()方法,先return了1,然后最终执行了finally后面的代码return了2 覆盖了1 所以最终返回了2
并将2赋值给了b
打印b就是2

评分

参与人数 1技术分 +1 收起 理由
尤圣回 + 1 赞一个!

查看全部评分

回复 使用道具 举报
public class smallT {
        public static void main(String args[]) {
                smallT t = new smallT();
                int b = t.get();
                System.out.println(b);
        }

        public int get() {//在try{}finally{}中,finally中的内容是必须要执行的。你可以当作是finally中的return将try中的return覆盖掉了,使try中return失效。                try {
                        return 1;
                } finally {
                        return 2;
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
尤圣回 + 1 赞一个!

查看全部评分

回复 使用道具 举报
缘木求鱼 发表于 2012-10-10 11:32
讲故事都是有针对性的,看你怎么看待故事阿。我现在有点厌烦人们把花虫鸟兽思考的跟人似的,自私到了极致 ...

你故意在finally中添加了休眠时间,想证明就算finally休眠了10秒,也是优先于try执行的对吗?
你看我在try里头写了输出语句,在finally中也写了输出语句。事实上,就算你在try里添加休眠时间,也是try里的语句先输出,finally是最后输出的
回复 使用道具 举报
本帖最后由 我是菜鸟 于 2012-10-10 13:29 编辑
缘木求鱼 发表于 2012-10-10 11:32
讲故事都是有针对性的,看你怎么看待故事阿。我现在有点厌烦人们把花虫鸟兽思考的跟人似的,自私到了极致 ...


class Test
{
        private static int b = 5;
        public static void main(String[] args)
        {
                Test t = new Test();
                System.out.println("main:"+b);
                b = t.get();
                System.out.println("t.get():"+b);
        }
        
        public int get()
        {
                int a = 0;
                try
                {
                        a = 10;
                        return 1;
                }
                finally
                {
                        System.out.println("try a:"+a);
                        System.out.println("try b:"+b);
                        return 2;
                }
        }
}

/*

结果:
main:5
try a:10
try b:5
t.get():2
*/

跳到get()方法之后是按顺序执行下去的,return 1;并不是马上把1赋给b
回复 使用道具 举报
本帖最后由 缘木求鱼 于 2012-10-10 13:53 编辑
qhasilver 发表于 2012-10-10 13:12
你故意在finally中添加了休眠时间,想证明就算finally休眠了10秒,也是优先于try执行的对吗?
你看我在tr ...

点醒我了,非常感谢。少考虑了那种情况?这样子代码足够说明问题了,的确是顺序执行,finally的return覆盖了try:handshake的
不过还是不大明白,为什么注释掉finally里的return 2后,S.o.p()语句不合和return 1一起打印出来
帮我看看这个问题:
关于TCP多线程上传图片
回复 使用道具 举报
本帖最后由 缘木求鱼 于 2012-10-10 13:48 编辑
我是菜鸟 发表于 2012-10-10 13:27
class Test
{
        private static int b = 5;

也非常感谢你,我明白了。我为代码少考虑了一种情况。
帮我看看这个问题:
关于TCP多线程上传图片
回复 使用道具 举报
王虎 中级黑马 2012-10-10 15:01:11
18#
这个小题如果在加个catch,执行流程是什么?
public class smallT
{
public static void main(String args[])
{
smallT t = new smallT();
int b = t.get();
System.out.println(b);
}

public int get()
{
try
{
return 1 ;
}catch(Excepiton e){
return  3;
}finally
{
return 2 ;
}
}
}
回复 使用道具 举报
王虎 发表于 2012-10-10 15:01
这个小题如果在加个catch,执行流程是什么?
public class smallT
{

  1. public class smallT
  2. {
  3. public static void main(String args[])
  4. {
  5. smallT t = new smallT();
  6. int b = t.get();
  7. System.out.println(b);
  8. }

  9. public int get()
  10. {
  11. try
  12. {
  13.         System.out.println("dotry");
  14.         int i = 10/0;//加入一个已知的错误,故意抛出异常
  15. return 1 ;
  16. }catch(Exception e){       
  17.         System.out.println("docatch");
  18. return  3;
  19. }finally
  20. {
  21.         System.out.println("dofinally");
  22. return 2 ;
  23. }
  24. }
  25. }

  26. //输出结果为:
  27. //dotry
  28. //docatch
  29. //dofinally
  30. //2
  31. //
复制代码
结论是先执行try--再执行catch--再finally
回复 使用道具 举报
王虎 发表于 2012-10-10 15:01
这个小题如果在加个catch,执行流程是什么?
public class smallT
{

现在明白了  应该还是2:L
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马