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 也是如此。在这种情况下,它还有助于代码安全,因为程序员很容易意外地将其遗漏。
如果您在try
orcatch
块和块中返回一个值,finally
请记住finally
块的返回值是您最终得到的值(最后一个执行的块)。这意味着如果您try
的某些代码不会抛出Exception
并且应该返回一个值,但您的finally
块也应该返回一个值,那么该finally
块的值就是实际返回的值。 这个 SO 线程谈到了这一点。我不相信在try
or中返回一个值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
块返回程序控制流,我在这里添加一个例子来解释finally
block的需要;
假设您从朋友那里借了一支笔。您使用它然后返回(我认为您是绅士)。现在无论发生什么,你都必须归还笔。您可以处理各种情况,并将大多数不可避免的情况置于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
}