finally异常处理中的块究竟执行了什么?
8 回答
它包含应该始终执行的代码,无论是否发生异常。
例如,如果你打开了一个文件,你应该在finally块中关闭它,以确保它总是被关闭;如果您在try块中关闭它,较早的异常将导致执行直接跳转到catch块并跳过关闭文件。
有关更多详细信息,请参阅Java 教程。
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();
}
}
无论您是否进入catch块,它都会执行,这意味着这是处理对象和进行其他清理的好地方。
当代码块中有多个返回语句时,我经常使用它来清理打开的资源,从而使代码更简洁,因为您不需要在每个返回语句之前克隆相同的“关闭资源”代码。保证代码将调用 finally 部分,即使您在 try 部分中执行 return 也是如此。在这种情况下,它还有助于代码安全,因为程序员很容易意外地将其遗漏。
如果您在tryorcatch块和块中返回一个值,finally请记住finally块的返回值是您最终得到的值(最后一个执行的块)。这意味着如果您try的某些代码不会抛出Exception并且应该返回一个值,但您的finally块也应该返回一个值,那么该finally块的值就是实际返回的值。 这个 SO 线程谈到了这一点。我不相信在tryor中返回一个值catch通常是必要的或最好的主意。另请注意,这会System.exit(0)杀死 JVM,从而在其他任何东西运行之前停止执行,这可能会导致您的finally块未执行。
finally 块主要用于执行关闭语句,例如con.close即关闭与数据库的连接....try 块后面总是跟着 catch 块或 finally(或两者都有)...如果您曾经进入try 块然后你的 finally 块肯定会执行,除了系统错误,finally 块中的异常.. finally 块的主要关键点是,即使处理或不处理异常,它总是会执行..
finally 关键字仅用于确保 finally 块中的代码必须在所有情况下执行,而不管是否发生异常。
例如:
try{
}
catch(Exception e){
}
finally{
System.out.print("finally executed");
}
注意:在上述情况下,finally 将始终执行。
尽管已经有很多答案给出了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
}