当一个方法抛出异常时,它会在调用堆栈中搜索以找到一个处理程序,对吗?从这个意义上讲,为什么exep.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()。为什么?
发布于 2017-07-06 16:17:10
IOException是一个检查过的异常,因此必须以某种方式处理。将throws IOException添加到main中会抑制这种行为,但这不是一个好的实践。
在second()中,可以捕获first()的所有异常,但仍然在second()的声明中包含throws IOException。这是不必要的,因为您可以保证first()引发的任何异常都将在second()中被捕获和处理。
欲了解更多信息,请阅读:例外情况
发布于 2017-07-06 16:14:11
如果声明void second() throws IOException,然后调用main中的方法,则需要捕获此方法可能抛出的异常,就像对first()方法所做的那样。在这种情况下,您只是不需要在throws中使用second()子句。
发布于 2017-07-06 16:14:20
您显式声明了方法second()抛出异常。编译器不知道异常实际上是在方法中捕获的。将catch部件移动到main()中,错误将消失。或者更好的是,删除throws语句,因为您没有抛出任何东西。
https://stackoverflow.com/questions/44954001
复制相似问题