黑马程序员技术交流社区

标题: finally中不能加return,continue或break,你知道吗? [打印本页]

作者: 何洪森    时间: 2012-2-9 14:11
标题: finally中不能加return,continue或break,你知道吗?
下面的代码看一下就OK了。
public class tryTest {
    public static void main(String[] args) {
        try {
                tryTest tryTest = new tryTest();
            System.out.println(tryTest.test());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public boolean test() throws Exception {
        try {
            throw new Exception("Something error");// 1.抛出异常
        } catch (Exception e) {// 2.捕获的异常匹配(声明类或其父类),进入控制块
            throw e;// 3. throw前控制转移到finally块,执行完后再返回
            
        } finally {
            return true;// 4. 控制转移,直接返回,不再返回catch块,吃掉了异常        }
    }
}
打印结果为true,main方法捕获不到异常。
也就是说如果在finally块中使用return,continue或break,则会把抛出的异常吃掉。
如果try或catch中有return语句,finally块中的return会覆盖掉try或catch块中的return。


作者: 余松霖    时间: 2012-2-9 20:26
有点不明白你说把抛出的异常吃掉什么意思。

你这个程序中test()方法中try块呵catch块中都是手动抛出异常,有异常的话该怎么办还是怎么办。和你finally块中的语句没有什么关系

continue 和break是流程控制的语句,一般都会用在循环里边。放在finally里边就算程序不出错也没有什么意义。

。。 tryTest tryTest = new tryTest();//这句看着有点别扭,建议把类名 驼峰标示。呵


作者: 成果    时间: 2012-2-9 23:33
本帖最后由 寻找幸福的13狼 于 2012-2-9 23:34 编辑

如果try中有return语句,在调用return语句之前就会先调用finally方法。你的finally方法中有个return就已执行反回了。后面的代码就不用执行了。finally一般用来做一些清尾工作,如:释放连接,等等.

作者: 黄秋    时间: 2012-2-10 03:21
赞成余松霖同学的说法,并不会吃掉异常,下面两段代码都不会:
  1. public class Test{
  2.         public static void main(String[] args) {
  3.                 try {
  4.                         throw new Exception("Something error");
  5.                 }catch (Exception e) {
  6.                         e.printStackTrace();
  7.                 } finally {
  8.                    return ;
  9.                 }
  10.         }
  11. }
复制代码
  1. public class Test{
  2.         public static void main(String[] args) {
  3.                 try {
  4.                         int a=1/0;
  5.                         return;        
  6.                 }catch (Exception e) {
  7.                         e.printStackTrace();
  8.                 } finally {
  9.                    return ;
  10.                 }
  11.         }
  12. }
复制代码

作者: 小白    时间: 2012-2-10 17:47
可以加的! 我加的 return ; 就没有问题!




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