最后在异常处理中

时间:2010-03-24 16:33:53

标签: java exception-handling finally

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

8 个答案:

答案 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)

如果您在trycatch区块以及finally区块中返回值,请记住finally区块的返回值是您的最终会(最后一个块被执行)。这意味着如果你try某些代码没有抛出Exception并且应该返回一个值,但是你的finally块也应该返回一个值,{{1} block的值是实际返回的值。 This SO thread谈到了这一点。我不认为在finallytry内返回值通常是必要的或最好的想法。另请注意,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
}