2017-07-06 168 views
0

当一个方法抛出一个异常时,它会搜索调用堆栈以查找处理程序权限?从这个意义上说,为什么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

您能告诉我们预期的产量和实际产量吗? – byxor

+3

'IOException'是一个检查异常。编译器不知道你对'exep.second()'的调用不会抛出一个,所以你的代码不能编译。 – jsheeran

+0

@byrox我正在学习异常处理,我只是想在发现异常时打印“设备错误”。 – Vyshak

回答

2

IOException是一个检查异常,因此必须以某种方式处理。为主要添加throws IOException会抑制此行为,但这不是一种好的做法。

second(),你捕获所有异常从first(),但你仍然包括的second()声明的throws IOException。这不是必需的,因为您可以保证first()引发的任何异常都会在second()中被捕获和处理。

更多阅读:Exceptions

1

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

1

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

0

您正在告诉编译器second()会抛出IOException,但是当您调用second()时,您并未将其封装在try/catch块中。如果你想离开它,那么你需要在你的main中包含一个try catch块。

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