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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王九日 中级黑马   /  2013-5-20 09:53  /  1229 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王九日 于 2013-5-20 13:19 编辑
  1. try {
  2.                 System.out.println("初始x值为"+x);
  3.                 return x;                        
  4.               }
  5.           finally {        
  6.                  x+=3;
  7.                         }
  8.                  return x+=5;//会报错
复制代码
  1. try {
  2.                 System.out.println("初始x值为"+x);
  3.                 return x;                        
  4.               }catch(Exception e){}//不写catch,finally之后不能写catch怎么回事
  5.           finally {        
  6.                  x+=3;
  7.                         }
  8.                  return x+=5;
复制代码
不写catch,在finally之后写return会报错是为什么。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

4 个回复

倒序浏览
这是因为没有写catch的话,该代码在try块中有return,那么方法执行到第一个return就结束了。
后面的finally之后的代码便成了不可达代码。(Unreachable code)
而写了catch之后,就可能因为catch捕获异常,而第一个return并没有执行。
这样后面的return是有可能执行的。故语法上就没有错。
事实上,第一段代码中,第二个return语句放到finally中,语法上也是没有错的。
因为finally中的代码一定会执行。

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

回复 使用道具 举报
如果不写catch,最后的return和try中的return会重复,而方法中只能有一个return;但写了catch后,你最后的return是在执行了catch的语句后返回的,因为这时候try中的语句由于被捕捉到异常,所以return执行不到。
回复 使用道具 举报
本帖最后由 张洪慊 于 2013-5-20 15:00 编辑

  1. class TryFinallyTest{
  2.         private int x;
  3.         public int  method(){
  4.                 try {
  5.                           System.out.println("初始x值为"+x);
  6.                           return x;                        
  7.                 }
  8.                
  9.                 finally {        
  10.                                 System.out.println("hehe");
  11.                       //return x+=2 //②      
  12.                 }
  13.      //return x+=2;
  14.          /*
  15.            这里为什么不能return?
  16.            finally上没有catch代码块
  17.            那么
  18.            ①如果try代码块中的语句发生异常,那么发生的是
  19.              编译时不被检测异常->RuntimeExcetption类异常
  20.              (因为非该类型异常要么try..catch要么throws)
  21.          会在return前执行finally代码块中内容->return
  22.                  finally下面语句执行不到,
  23.                  注意在返回时该方法上
  24.                  会有一个隐式的throws RuntimeException(或其子类)
  25.            ②如果try代码块中不发生异常,依然会在return前执行finally代码块中内容->return
  26.                  finally下面语句依然执行不到
  27.            此时可以把return放在finally中(②),finally代码顺序执行
  28.            使用finally中的return,不再是try中的return
  29.          */
  30.                
  31.   }
  32. public static void main(String[] args){
  33.   System.out.println(new TryFinallyTest().method());

  34. }
  35. }
复制代码

  1. class TryFinallyTest2{
  2.         private int x;
  3.         public int  method(){
  4.                 try {
  5.                           //java.io.FileReader fr=new java.io.FileReader("k://abc.txt");//我这个一定发生异常,没有K盘符
  6.                           //System.out.println(x);
  7.                           return x;                        
  8.                 }
  9.                 catch(java.io.IOException  e){
  10.                    //System.out.println("文件不存在");
  11.                 }
  12.                 finally {        
  13.                                 //System.out.println("hehe");
  14.                            
  15.                 }
  16.      return x+=2;
  17.         /*
  18.      这里之所以可以return,个人能理解,编译器
  19.          认为该语句有可能被执行到:当try中在return之前发生异常,程序跳转
  20.          catch对其处理后,程序继续向下执行,如果下面有return语句,那么try中
  21.          return 不再执行.
  22.          */
  23.                
  24.   }
  25. public static void main(String[] args){
  26.   System.out.println(new TryFinallyTest2().method());
  27.   /*
  28.   文件不存在
  29.   hehe
  30.   2
  31.   */

  32. }
  33. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
|---try catch finally代码块组合
                                        |---- try catch finally
                                        |---- try catch(多个),没有必要释放资源,可以不定义finally
                                        |---- try finally 异常无法直接catch处理(直接声明抛出),但是需要资源关闭,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马