【问题标题】:Is finally block is really needed? [duplicate]真的需要finally块吗? [复制]
【发布时间】:2018-08-02 04:17:49
【问题描述】:

如果 catch 块之后的语句无论如何都要执行,那么 finally 块在 java 中的真正用途是什么? 示例

 try {
 //Code
}
catch (Exception e)
{
//Code
}
finally {
 System.out.println("anyway it will be        executed");
 }

System.out.println("anyway it will be executed");

【问题讨论】:

  • 代码中的任何地方都可能有return语句。即使代码可能已经返回到调用方法,finally 块中的代码仍然会被执行

标签: java try-catch finally


【解决方案1】:

底部的语句不保证执行。例如,如果

  • try 块或匹配的 catch 块使用 return(或在某些情况下为 break
  • catch 块中没有一个与异常匹配,因此异常未被捕获
  • catch 中引发了另一个(或相同的)异常(但未被捕获)

在所有这些情况下,finally 语句保证会被执行。

【讨论】:

  • 即使我们在 try 块中添加System.exit(0)
  • @AshishKudale:我没试过,但不是根据Does finally always execute in Java?。在 Python 中,finally 甚至会在 exit 上执行,但 Java 似乎没有提供同样的礼貌。
  • 添加到答案中。 finally 的主要用途是释放锁定在 try 块内的资源。例如:假设你有一个在 try 中打开的文件。您可以编写多个处理多种异常类型的 catch 块。在每个捕获块(冗余)中关闭打开的文件是不明智的。所以 Final 通过将关闭文件逻辑只写在一个地方来帮助你。
  • @AshishKudale No finally 块将不会在 System.exit(0) 之后执行,并且您的程序将在执行 System.exit(0) 后立即终止..
  • @DhaRmvEErsiNgh:现在进一步偏离主题,但不,不是立即相当 - 仍然(几乎没有)时间用于关闭挂钩(请参阅Runtime.addShutdownHook)。跨度>
【解决方案2】:

您的 catch 可以return 或抛出异常,在此之前您可以使用 finally 来释放资源。 finally 在控件传回给调用者之前执行。

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 1970-01-01
    • 2012-09-12
    • 2011-03-01
    • 2016-08-15
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 2019-06-14
    相关资源
    最近更新 更多