为什么在catch之后使用finally而不是代码

cod*_*441 75 java try-catch-finally

为什么这样呢

} catch (SQLException sqle) {
    sqle.printStackTrace();
} finally {
    cs.close();
    rs.close();
}
Run Code Online (Sandbox Code Playgroud)

而不是这个

} catch (SQLException sqle) {
    sqle.printStackTrace();
}
rs.close();
cs.close();
Run Code Online (Sandbox Code Playgroud)

JUS*_*ION 83

因为如果抛出异常,除非捕获到异常,否则在执行之后不会有代码try.一个块总是执行,不管你里面发生了什么块.finallytry

  • >"除非发现例外情况" - 这个例外是抓住了不是吗? (11认同)
  • 这个答案是正确的,可能会抛出不同类型的异常. (10认同)
  • pilavdzice是对的,运行时异常可能是一个很好的例子 (2认同)
  • 这有什么不同吗?如果没有“catch”块,“finally”块就有意义。 (2认同)

Jon*_*eet 24

看看你的陷阱 - 它会抛出DAOException.因此,即使在您给出的示例中,也不会执行catch块之后的语句.你所展示的内容(将一个异常包装在另一个异常中)是一种常见的模式 - 但另一种可能性是catch块"意外地"抛出异常,例如因为其中一个调用失败.

此外,您可能还有其他异常没有捕获 - 要么是因为您声明了方法抛出它们,要么是因为它们是未经检查的异常.你是否真的想泄漏资源,因为IllegalArgumentException被扔到了某个地方?


Ber*_*t F 12

因为如果抛出异常,

  • finally子句中的代码将在异常传播时执行,即使异常中止了方法执行的其余部分;

  • try/catch块之后的代码将不会被执行,除非catch块捕获异常而不重新抛出异常.

  • 第二点+1 (5认同)

hvg*_*des 7

因为它确保了finally块中的东西被执行.例如,catch之后可能没有执行catch的东西,catch块中有另一个异常,这是非常可能的.或者你只是做你做的,并抛出一个包装原始异常的异常.


Adi*_*arg 6

根据HeadFirst Java,即使try或catch块具有return语句,也会运行finally块。流程最终跳到最后再返回。

  • 我不同意。这个答案实际上非常重要。到目前为止,大多数答案都是错误的,但是阿迪蒂(Aditi)给出了一个关键原因,为什么您有时可能希望使用“最终”,因此她值得称赞。 (2认同)