当一个方法抛出异常时,它会搜索调用堆栈来找到一个处理程序吗?从这个意义上说,为什么 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()时,错误消失了。为什么?
答案 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
。