5

finally异常处理中的块究竟执行了什么?

4

8 回答 8

8

它包含应该始终执行的代码,无论是否发生异常。

例如,如果你打开了一个文件,你应该在finally块中关闭它,以确保它总是被关闭;如果您在try块中关闭它,较早的异常将导致执行直接跳转到catch块并跳过关闭文件。

有关更多详细信息,请参阅Java 教程

于 2010-03-24T16:35:31.037 回答
4

finally 块总是执行,不管是否抛出异常。我能想到的经典使用示例是关闭文件。

FileOutputStream stream = null;
try{
    // do stuff with the stream here
} catch (IOException ex){
    // handle exception
} finally{
    // always close the stream
    if(stream != null){
        stream.close();
    }
}
于 2010-03-24T16:42:50.577 回答
3

无论您是否进入catch块,它都会执行,这意味着这是处理对象和进行其他清理的好地方。

于 2010-03-24T16:35:14.267 回答
2

当代码块中有多个返回语句时,我经常使用它来清理打开的资源,从而使代码更简洁,因为您不需要在每个返回语句之前克隆相同的“关闭资源”代码。保证代码将调用 finally 部分,即使您在 try 部分中执行 return 也是如此。在这种情况下,它还有助于代码安全,因为程序员很容易意外地将其遗漏。

于 2010-03-24T16:43:26.980 回答
0

如果您在tryorcatch块和块中返回一个值,finally请记住finally块的返回值是您最终得到的值(最后一个执行的块)。这意味着如果您try的某些代码不会抛出Exception并且应该返回一个值,但您的finally块也应该返回一个值,那么该finally块的值就是实际返回的值。 这个 SO 线程谈到了这一点。我不相信在tryor中返回一个值catch通常是必要的或最好的主意。另请注意,这会System.exit(0)杀死 JVM,从而在其他任何东西运行之前停止执行,这可能会导致您的finally块未执行。

于 2011-10-20T20:57:52.633 回答
0

finally 块主要用于执行关闭语句,例如con.close即关闭与数据库的连接....try 块后面总是跟着 catch 块或 finally(或两者都有)...如果您曾经进入try 块然后你的 finally 块肯定会执行,除了系统错误,finally 块中的异常.. finally 块的主要关键点是,即使处理或不处理异常,它总是会执行..

于 2015-04-03T15:07:56.330 回答
0

finally 关键字仅用于确保 finally 块中的代码必须在所有情况下执行,而不管是否发生异常。

例如:

 try{
     }
     catch(Exception e){
     }
      finally{
             System.out.print("finally executed");
            }

注意:在上述情况下,finally 将始终执行。

于 2015-08-18T20:17:31.497 回答
0

尽管已经有很多答案给出了finally块需要在所有条件下执行某些代码,无论是由于异常或一些错误代码而导致的中断,还是您从try块返回程序控制流,我在这里添加一个例子来解释finallyblock的需要;

假设您从朋友那里借了一支笔。您使用它然后返回(我认为您是绅士)。现在无论发生什么,你都必须归还笔。您可以处理各种情况,并将大多数不可避免的情况置于finally阻塞状态。

//Borrow the pen
try{
  //Use the pen
}catch(StolenPen how){
  //Buy new pen
}catch(InkFinished how){
  //Refill the pen
}catch(SomethingWrong how){
  //Buy new pen
}finally{
  //Return new pen
}
于 2018-01-14T07:57:31.777 回答