异常处理错误

时间:2017-07-06 16:07:41

标签: java exception-handling

当一个方法抛出异常时,它会搜索调用堆栈来找到一个处理程序吗?从这个意义上说,为什么 exep.second(); 会出错?即使我在方法 second()中发现了异常。这是我的代码:

public class Exep {
void first()throws IOException{
    throw new IOException("device error");
}
void second()throws IOException{
    try{
        first();
    }catch(Exception e){
        System.out.println(e);
    }
}
public static void main(String args[]){
    Exep exep = new Exep();
    exep.second();
}

}

但是将抛出IOException 添加到 main()时,错误消失了。为什么?

4 个答案:

答案 0 :(得分:2)

IOException是一个经过检查的异常,因此必须以某种方式处理。将throws IOException添加到main会抑制此行为,但这不是一种好习惯。

second()中,您可以捕获first()的所有例外情况,但仍然会在throws IOException的声明中包含second()。这不是必需的,因为您可以保证在first()中捕获并处理second()引发的任何异常。

更多阅读:Exceptions

答案 1 :(得分:1)

如果声明void second() throws IOException然后在main中调用该方法,则需要捕获此方法可能抛出的异常,就像使用first()方法一样。在这种情况下,您根本不需要throws中的second()条款。

答案 2 :(得分:1)

您明确声明方法second()会引发异常。编译器不知道异常实际上是在方法中捕获的。将catch部分移至main(),错误将消失。或者甚至更好,删除throws语句,因为你没有扔任何东西。

答案 3 :(得分:1)

您告诉编译器second()抛出IOException,但是当您调用second()时,您不会将其包装在try / catch块中。如果你想保持原样,那么你需要在main中包含一个try catch块。

但是,正如您所拥有的那样,您永远不会从second()内部抛出异常,因此您可以从那里删除行throws IOException