日期:2014-05-20  浏览次数:20745 次

异常处理中的一点困惑,请指点!
本帖最后由 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

------解决方案--------------------
引用:
本帖最后由 apollo_liiu 于 2013-01-23 17:08:11 编辑
            首先看一个方法:
 
Java code?123456789101112131415public static void methoda()throws Exception {    try {        int b = 12;        in……


因为你在finally快return了:
finally{
    System.out.println("finally ..."); 
    return ret;
}

------解决方案--------------------
我猜是这个原因 有了finally估计是finally来扑捉了,你可以再没有返回值的finally语句中加个return ;这样编译器也不会强制要求我们抛异常 坐等楼下大神解释
------解决方案--------------------
debug调试了一下,methoda中,在finally块执行完后会判断抛出的异常在大括号结束后会显示suspended exception
methodb中,finally块中直接return返回值,强制退出该方法的执行,返回到main方法,没有执行到finally块的后括号}就已经结束