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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chuanyueing 中级黑马   /  2013-3-6 22:13  /  1661 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如果我不考虑异常丢失的情况下,
还有别的限制要求try后面一定要跟catch吗?
请看下面两段代码:
  1. int i = 1;
  2.           try
  3.           {
  4.               i = 2;
  5.               return i;
  6.           }
  7.             
  8.           finally
  9.           {
  10.               i = 3;
  11.               System.out.println("finally block executed");
  12.           }
  13. <b>//执行结果是
  14. //finally block executed
  15. //2
  16. //间接证明了finally在return的前面执行</b>
复制代码
然而加上catch之后:
  1. int i = 1;
  2.        try
  3.        {
  4.            i = 2;
  5.            return i;
  6.        }catch(Exception e){
  7.               
  8.        }finally
  9.        {
  10.            i = 3;
  11.            System.out.println("finally block executed");
  12.            return i;
  13.        }
  14. <b>//不但编译通不过了而且结果完全不同
  15. //结果是
  16. //finally block executed
  17. //3
  18. //这样的话finally是在return后面执行</b>
复制代码
两段程序的执行结果完全不一样
就因为多了个catch
请教各位大牛可否给予一个比较详细的解释  感激不尽

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 神马都是浮云

查看全部评分

11 个回复

正序浏览
也许是我问的问题不够明确,大家说法不一样,现在更晕了,我再查些资料看看,总之谢谢大伙了。
回复 使用道具 举报
本帖最后由 克零岚 于 2013-3-7 10:15 编辑

这个就涉及到try{}catch{}finally{}和try{}finally{}d的执行顺序了
如果没有catch到异常,就finally,然后一定会找try中的return。如果catch到异常,就不会到try中去找return执行。
为什么这么规定呢??因为:try中下边的代码是建立在try中上边的没有错误的基础上才执行的,
你写了catch,则说明try中的return之前的某一句代码可能异常,jvm这个时候就可能到catch中去。
而到了catch中之后,try的抛出异常的代码之后的代码是根本不会执行的,
所以结果是:只要你写了catch,那么return是有可能不会执行到的。
但是finally无论有没有异常都会执行,所以会出现上面执行结果的区别
回复 使用道具 举报
问题已经解决谢谢各位
回复 使用道具 举报
根据代码分析是没有异常,所以不会执行catch代码块中的内容try语句块中的内容执行以后,肯定要执行finally语句块,只有在一种情况下不执行,finally语句块中的内容,就是强行停止程序,执行完finally语句块中的内容以后,才会return,也就是说finally中的内容,是在return之前执行的那么为什么还是会返回2 ,原因是在finally中无法改变返回值。
然后你又在finally中添加一个return,因为finally中的内容是这些在try的return之前,所以在finally的时候,值就已经返回了,所以最后输出的是3。
回复 使用道具 举报
你把finally 里面的 return 放到外面 就OK了   
提示缺少返回语句的原因是 :可能发生异常,如果发生了就转到catch了  那就没有返回值了    不行  必须加一个return 可以再catch里面 可以在finally里面  也可以在外界
如果没有发生异常,那就先执行try   当执行到return时  发现还没有执行finally  那就转向finally  如果finally里面有return  那就直接返回了  不会回到try的return去执行了
当然return在外界  就执行不到了   只执行完finally就回到return继续执行了   但要知道finally的执行并没有改变 i 的值  
回复 使用道具 举报
本帖最后由 门文通 于 2013-3-7 02:48 编辑
张宁 发表于 2013-3-6 23:53
我不知道您拿什么运行的,你这段代码是错误的你的代码的输出结果。我真的很困惑。 try 运行错误,跳转到cat ...

可以有try{} finally{}  这种格式,只是有的时候发生异常需要处理的话就抛出异常就好了 就可以不写catch了
回复 使用道具 举报
我不知道您拿什么运行的,你这段代码是错误的
  1. int i = 1;
  2.           try
  3.           {
  4.               i = 2;
  5.               return i;//这是什么用?它会报出 空方法没有返回值得错误的。你如果想验证try catch ,finally 的顺序的话,可以加输出语句验证。
  6.           }
  7.             
  8.           finally
  9.           {
  10.               i = 3;
  11.               System.out.println("finally block executed");
  12.           }
复制代码
你的代码的输出结果。我真的很困惑。 try 运行错误,跳转到catch,,finally 不管报不报错一定会执行的。
回复 使用道具 举报
朱玺 发表于 2013-3-6 22:30
因为我的函数是int型的,有了catch它说必须有个返回值,自动就加上return i;才可以运行,不然都不能运行 ...

写在括号外呢
回复 使用道具 举报
本帖最后由 戴乾刚 于 2013-3-6 22:54 编辑

第一段代码之所以先执行了finally中的输出语句是因为只有当finally中的代码执行完后函数才结束,返回函数执行结果,也就是 i 的值,
但这并不能说明finally中的语句在try之前执行,你可以在try中的代码里面加上一条输出语句试一下,try中的输出语句会先执行

至于加catch的问题
你写的代码是不会出现异常的,所以加不加都无所谓

但是如果try中的语句会抛出异常是,不加catch语句,则要将异常抛出(Runtime异常除外)
catch语句就是对异常的处理。
回复 使用道具 举报
李志卫 发表于 2013-3-6 22:25
.....你第二段代码 finally后面是不是多了个 return i???

因为我的函数是int型的,有了catch它说必须有个返回值,自动就加上return i;才可以运行,不然都不能运行
回复 使用道具 举报
.....你第二段代码 finally后面是不是多了个 return i???
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马