黑马程序员技术交流社区
标题:
catch的问题
[打印本页]
作者:
王九日
时间:
2013-5-20 09:53
标题:
catch的问题
本帖最后由 王九日 于 2013-5-20 13:19 编辑
try {
System.out.println("初始x值为"+x);
return x;
}
finally {
x+=3;
}
return x+=5;//会报错
复制代码
try {
System.out.println("初始x值为"+x);
return x;
}catch(Exception e){}//不写catch,finally之后不能写catch怎么回事
finally {
x+=3;
}
return x+=5;
复制代码
不写catch,在finally之后写return会报错是为什么。
作者:
黑马伍哲沂
时间:
2013-5-20 10:20
这是因为没有写catch的话,该代码在try块中有return,那么方法执行到第一个return就结束了。
后面的finally之后的代码便成了不可达代码。(Unreachable code)
而写了catch之后,就可能因为catch捕获异常,而第一个return并没有执行。
这样后面的return是有可能执行的。故语法上就没有错。
事实上,第一段代码中,第二个return语句放到finally中,语法上也是没有错的。
因为finally中的代码一定会执行。
作者:
金辉
时间:
2013-5-20 10:36
如果不写catch,最后的return和try中的return会重复,而方法中只能有一个return;但写了catch后,你最后的return是在执行了catch的语句后返回的,因为这时候try中的语句由于被捕捉到异常,所以return执行不到。
作者:
张洪慊
时间:
2013-5-20 11:11
本帖最后由 张洪慊 于 2013-5-20 15:00 编辑
class TryFinallyTest{
private int x;
public int method(){
try {
System.out.println("初始x值为"+x);
return x;
}
finally {
System.out.println("hehe");
//return x+=2 //②
}
//return x+=2;
/*
这里为什么不能return?
finally上没有catch代码块
那么
①如果try代码块中的语句发生异常,那么发生的是
编译时不被检测异常->RuntimeExcetption类异常
(因为非该类型异常要么try..catch要么throws)
会在return前执行finally代码块中内容->return
finally下面语句执行不到,
注意在返回时该方法上
会有一个隐式的throws RuntimeException(或其子类)
②如果try代码块中不发生异常,依然会在return前执行finally代码块中内容->return
finally下面语句依然执行不到
此时可以把return放在finally中(②),finally代码顺序执行
使用finally中的return,不再是try中的return
*/
}
public static void main(String[] args){
System.out.println(new TryFinallyTest().method());
}
}
复制代码
class TryFinallyTest2{
private int x;
public int method(){
try {
//java.io.FileReader fr=new java.io.FileReader("k://abc.txt");//我这个一定发生异常,没有K盘符
//System.out.println(x);
return x;
}
catch(java.io.IOException e){
//System.out.println("文件不存在");
}
finally {
//System.out.println("hehe");
}
return x+=2;
/*
这里之所以可以return,个人能理解,编译器
认为该语句有可能被执行到:当try中在return之前发生异常,程序跳转
catch对其处理后,程序继续向下执行,如果下面有return语句,那么try中
return 不再执行.
*/
}
public static void main(String[] args){
System.out.println(new TryFinallyTest2().method());
/*
文件不存在
hehe
2
*/
}
}
复制代码
作者:
Super_Class
时间:
2013-5-20 12:03
|---try catch finally代码块组合
|---- try catch finally
|---- try catch(多个),没有必要释放资源,可以不定义finally
|---- try finally 异常无法直接catch处理(直接声明抛出),但是需要资源关闭,
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2