黑马程序员技术交流社区
标题:
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
赞成余松霖同学的说法,并不会吃掉异常,下面两段代码都不会:
public class Test{
public static void main(String[] args) {
try {
throw new Exception("Something error");
}catch (Exception e) {
e.printStackTrace();
} finally {
return ;
}
}
}
复制代码
public class Test{
public static void main(String[] args) {
try {
int a=1/0;
return;
}catch (Exception e) {
e.printStackTrace();
} finally {
return ;
}
}
}
复制代码
作者:
小白
时间:
2012-2-10 17:47
可以加的! 我加的 return ; 就没有问题!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2