没有try和catch块,仅有finally块是否有效?

28

我尝试在不使用 try/catch 块的情况下使用 finally 块,但在 Eclipse 中出现了错误。

我能否在不使用 try/catch 块的情况下使用 finally 块?


即使您可以在没有try的情况下使用finally,但如果您使用goto跳过finally语句,您希望finally如何运行呢? finally仅与使用try语句标记为相关的代码相关。否则,行为将非常恼人。 - CodeCamper
你的意思是在不使用catch块的情况下,try-with-finally的用例是什么?我认为你不能只使用“finally”,它应该与一些try块一起使用。 - user1923551
11个回答

22
finally 至少应该有一个 try 块,catch 是可选的。finally块的目的是确保无论是否抛出异常,都可以清理掉东西。根据JLS的规定:
  

finally字句确保 finally 块在执行 try 块和任何可能被执行的 catch 块之后执行,无论控制如何离开 try 块或 catch 块。

因此,finally 应始终紧跟在try块之后。

8
您必须有一个带有finally块的try块。try块定义了哪些代码行将被finally代码块跟随。如果在try块之前抛出异常,则finally代码块将不会执行。添加catch块是可选的:
try {

  // something

} finally {
  // guaranteed to run if execution enters the try block
}

7

如果在try块之前抛出异常,则finally代码将不会执行。当try块退出时,finally块始终执行。因此,您可以在没有catch的情况下使用finally,但必须使用try。


Stinepike在6年前几乎给出了完全相同的答案。 - JustAFellowCoder

5
try {
    // Block of code with multiple exit points
}
finally {
    // Block of code that must always be executed when the try block
    // is exited, no matter how the try block is exited
}

3
请将文本翻译成中文。仅返回翻译后的文本:您应该添加一个解释。 - Zelldon

3

当try块退出时,finally块总是会执行。所以你可以在没有catch的情况下使用finally,但必须使用try。

更多详情请查看此处的文档。


2
你不能在没有try的情况下使用finally的原因是,你可以在同一作用域内有多个finally语句,而try指示了finally所属的代码块,以防发生错误。 finally的另一个有趣特性是,当进入try时,它必须无论如何执行。例如,如果你使用goto跳过finally语句会怎样?如果gototry内部,则会执行finally语句;但是,如果gototry语句之上/之外,则会跳过finally代码。 finally仅与被包含在try中的代码相关。如果没有try,则finally对任何内容都不相关。

1
  • try语句应该有catch块或finally块,也可以同时拥有这两个块。

  • 在try-catch-finally块之间我们不能编写任何代码。

  • 如果没有try语句,我们就不能有catch或finally子句。

  • 我们可以在一个try语句中有多个catch块。try-catch块可以像if-else语句一样嵌套。

  • 在一个try-catch语句中只能有一个finally块。


0

不可以。

你可以使用 Try-catch-finallytry-finally

 try {

    }catch (Exception e){

    }
    finally{

    }

或者

try {

    }
    finally{

    }

0
  • 仅使用try块是不正确的。
  • try块只能与catch或finally块中的一个块一起使用。
  • 您可以使用try块与catch和finally一起使用。如果您在try块中使用finally块,则catch块变为可选。

0

来自Oracle Trails:

当try块退出时,finally块总是执行。这确保了即使发生意外异常,也会执行finally块。

从上述语句中可以看出,你不能单独使用finally块。以下是允许的组合。

  1. try catch finally

  2. try catch

  3. try finally


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接