在finally块中重新抛出异常

时间:2015-03-29 02:13:07

标签: java exception-handling

我编写了如下函数,在try块中我抛出IOException,它由下一个catch块处理并再次抛出FileNotFoundException,在finally块中我再次抛出NULLPointerException。所以我的问题是FileNotFOundException异常是未处理的异常? 为什么调用函数只获取NULLPointerException,虽然FileNotFounException未处理(我假设的是什么)?

static void fun(){
        try{
            throw new IOException();
        }
        catch(IOException e){
            throw new FileNotFoundException();
        }
        finally{
            throw new NullPointerException();
        }
    }

3 个答案:

答案 0 :(得分:0)

除非您将旧的异常包装在新的异常中,否则您一次只能抛出一个异常。最后是最后一场胜利。

由于您显然没有发布工作代码,但代码旨在探索此问题并展示行为,因此我不会打扰您。我将向您介绍一些代码,以解决此问题后面的一个非常现实的问题。

当你尝试在finally中关闭某些东西并且close方法本身抛出异常时会出现问题。您最终需要second try

答案 1 :(得分:0)

您没有正确使用finally声明。

根据Java docs:

  

当try块退出时,finally块始终执行。这确保即使发生意外异常也会执行finally块。但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码。将清理代码放在finally块中总是一种很好的做法,即使没有预期的例外情况也是如此。

所以,是的,你确实有一个未处理的异常。如果你试图处理多个错误,我会抛出异常,而不是像这样使用try/catch

static void fun() throws FileNotFoundException, NullPointerException{
   //your code here

}

然后当你调用方法时,你可以在try / catch中包围它:

    try{
       YourClass.fun();
    }catch(Exception e){
       //handle the error.
    }finally{
       //clean up code, this is optional
    }

答案 2 :(得分:-1)

是的,FileNotFoundException未处理。要处理它,请使用另一个trycatch块包围fun()

try{
  fun();
catch(FileNotFoundException ex){
}
catch(NullPointerException ex){
}