异常处理中的一点困惑,请指点!
本帖最后由 apollo_liiu 于 2013-01-23 17:08:11 编辑
首先看一个方法:
public static void methoda()throws Exception {
try {
int b = 12;
int c;
for(int i=2;i>=-2;i--){
c = b/i;
System.out.println("i=" + i);
}
} catch (Exception e) {
System.out.println("catch ... ");
throw new IOException();
}finally{
System.out.println("finally ... ");
}
}
该方法无返回值,在catch块中抛出一个IOException,Java编译器告诉我”当有
非运行时异常出现时,必须捕获或声明它“,所以我在方法头处throws Exception。这个方法可以正确编译和运行。
问题来了,我把上面的方法稍微修改了一下,如下:
public static boolean methodb() {
boolean ret = true;
try {
int b = 12;
int c;
for(int i=2;i>=-2;i--){
c = b/i;
System.out.println("i=" + i);
}
return true;
} catch (Exception e) {
System.out.println("catch ...");
ret = false;
throw new IOException();
}finally{
System.out.println("finally ...");
return ret;
}
}
该方法有返回值,在catch块中抛出一个IOException,但此时竟然不需要”捕获或声明“也能正常编译和运行。这是怎么回事呢?
异常
throw
Exception
------解决方案--------------------
因为你在finally快return了:
finally{
System.out.println("finally ...");
return ret;
}
------解决方案--------------------我猜是这个原因 有了finally估计是finally来扑捉了,你可以再没有返回值的finally语句中加个return ;这样编译器也不会强制要求我们抛异常 坐等楼下大神解释
------解决方案--------------------debug调试了一下,methoda中,在finally块执行完后会判断抛出的异常在大括号结束后会显示suspended exception
methodb中,finally块中直接return返回值,强制退出该方法的执行,返回到main方法,没有执行到finally块的后括号}就已经结束