异常处理中的finally
块究竟执行了什么?
答案 0 :(得分:8)
它包含应始终执行的代码,无论是否发生异常。
例如,如果您打开了一个文件,则应在finally
块中将其关闭,以确保它始终关闭;如果你在try
块中关闭它,之前的异常将导致执行直接跳转到catch
块并跳过关闭文件。
有关详细信息,请参阅Java tutorials。
答案 1 :(得分: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();
}
}
答案 2 :(得分:3)
无论你是否进入catch
块,它都会执行,这意味着它是处理对象和进行其他清理的好地方。
答案 3 :(得分:2)
当代码块中有多个return语句时,我会大量使用它来清理开放资源,这使得代码更加清晰,因为您不需要在每个return语句之前克隆相同的“close resource”代码。即使您在try部分中进行了返回,也可以保证代码将调用finally部分。在这种情况下,它还有助于代码安全,因为程序员可以轻易地将其遗漏。
答案 4 :(得分:0)
如果您在try
或catch
区块以及finally
区块中返回值,请记住finally
区块的返回值是您的最终会(最后一个块被执行)。这意味着如果你try
某些代码没有抛出Exception
并且应该返回一个值,但是你的finally
块也应该返回一个值,{{1} block的值是实际返回的值。 This SO thread谈到了这一点。我不认为在finally
或try
内返回值通常是必要的或最好的想法。另请注意,catch
会终止JVM,从而在执行任何其他操作之前停止执行,这可能会导致System.exit(0)
块未执行。
答案 5 :(得分:0)
finally块主要用于执行close语句,例如 con.close ,即关闭数据库的连接.... try块后面总是跟着catch块或者最后(或者两者都是)...如果您曾经进入try块,那么您的finally块将被定义执行,除了系统错误,finally块中的异常.... finally块的主要关键点是它始终是即使处理了异常也执行了。
答案 6 :(得分:0)
finally关键字用于确保finally块中的代码必须在所有情况下都执行,而不管异常是否发生。
例如:
try{
}
catch(Exception e){
}
finally{
System.out.print("finally executed");
}
注意:在上述情况下,最终将始终执行。
答案 7 :(得分:0)
虽然已经有很多答案已经给出finally
块在所有条件下都需要执行一段代码,无论是由于异常还是某些错误代码而导致中断,或者你返回程序控制来自try
块的流程,我在这里添加一个示例来解释finally
块的需要;
我们假设你的朋友you have borrowed a pen。你使用它然后返回(我认为你是一个绅士)。现在无论发生什么,你都必须退回笔。您可以处理各种情况,并在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
}