黑马程序员技术交流社区

标题: try catch 相关问题 [打印本页]

作者: chuanyueing    时间: 2013-3-6 22:13
标题: try catch 相关问题
如果我不考虑异常丢失的情况下,
还有别的限制要求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
请教各位大牛可否给予一个比较详细的解释  感激不尽

作者: lzw123451    时间: 2013-3-6 22:25
.....你第二段代码 finally后面是不是多了个 return i???
作者: chuanyueing    时间: 2013-3-6 22:30
李志卫 发表于 2013-3-6 22:25
.....你第二段代码 finally后面是不是多了个 return i???

因为我的函数是int型的,有了catch它说必须有个返回值,自动就加上return i;才可以运行,不然都不能运行
作者: 戴乾刚    时间: 2013-3-6 22:51
本帖最后由 戴乾刚 于 2013-3-6 22:54 编辑

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

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

但是如果try中的语句会抛出异常是,不加catch语句,则要将异常抛出(Runtime异常除外)
catch语句就是对异常的处理。
作者: lzw123451    时间: 2013-3-6 22:56
朱玺 发表于 2013-3-6 22:30
因为我的函数是int型的,有了catch它说必须有个返回值,自动就加上return i;才可以运行,不然都不能运行 ...

写在括号外呢
作者: 张宁    时间: 2013-3-6 23:53
我不知道您拿什么运行的,你这段代码是错误的
  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 不管报不报错一定会执行的。
作者: amen0205    时间: 2013-3-7 02:34
本帖最后由 门文通 于 2013-3-7 02:48 编辑
张宁 发表于 2013-3-6 23:53
我不知道您拿什么运行的,你这段代码是错误的你的代码的输出结果。我真的很困惑。 try 运行错误,跳转到cat ...

可以有try{} finally{}  这种格式,只是有的时候发生异常需要处理的话就抛出异常就好了 就可以不写catch了
作者: amen0205    时间: 2013-3-7 02:57
你把finally 里面的 return 放到外面 就OK了   
提示缺少返回语句的原因是 :可能发生异常,如果发生了就转到catch了  那就没有返回值了    不行  必须加一个return 可以再catch里面 可以在finally里面  也可以在外界
如果没有发生异常,那就先执行try   当执行到return时  发现还没有执行finally  那就转向finally  如果finally里面有return  那就直接返回了  不会回到try的return去执行了
当然return在外界  就执行不到了   只执行完finally就回到return继续执行了   但要知道finally的执行并没有改变 i 的值  
作者: scott0610    时间: 2013-3-7 09:33
根据代码分析是没有异常,所以不会执行catch代码块中的内容try语句块中的内容执行以后,肯定要执行finally语句块,只有在一种情况下不执行,finally语句块中的内容,就是强行停止程序,执行完finally语句块中的内容以后,才会return,也就是说finally中的内容,是在return之前执行的那么为什么还是会返回2 ,原因是在finally中无法改变返回值。
然后你又在finally中添加一个return,因为finally中的内容是这些在try的return之前,所以在finally的时候,值就已经返回了,所以最后输出的是3。

作者: chuanyueing    时间: 2013-3-7 10:01
问题已经解决谢谢各位
作者: 克零岚    时间: 2013-3-7 10:13
本帖最后由 克零岚 于 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无论有没有异常都会执行,所以会出现上面执行结果的区别
作者: chuanyueing    时间: 2013-3-7 10:16
也许是我问的问题不够明确,大家说法不一样,现在更晕了,我再查些资料看看,总之谢谢大伙了。




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