如果我们同时在 try 和 catch 中进行资源清理,是否可以避免 finally 阻塞?

Can we avoid finally block if we do resource cleanup in both try and catch together?

如果我们在 一起尝试和捕获 中进行资源清理,我们是否可以避免 finally 阻塞?

例如 我们可以做这样的事情而不使用 finally 吗?

try{
 // Some statements
 db.close();
}catch(Exception e){
 db.close();
}

它会按预期工作吗?如果 那么我们为什么应该或不应该使用它?

是的,我们可以。但是为什么你想调用相同的代码两次而不是在任何情况下都会执行一次调用?

有关最佳做法,请参阅此问题Java try/catch/finally best practices while acquiring/closing resources

只需使用try-with-resources:

try(Connection db = getConnection()){
    //perform stuff
}

一旦 try 块完成处理,Connection 将关闭。

这按预期工作,但是,它会重复代码,这意味着如果你想更改 "final part code" 你将不得不更改代码两次,而不是一次,如果你把它放在 finally 块中.

是的,它会起作用。 finally block基本用于try/catch中的常用操作。但是想想你在 try 和 catch 中有 10-20 个共同的语句。那么它会是什么样子呢? 最后块帮助您删除代码的冗余。

尽可能使用 try-with-resources 或 try-finally (try-catch-finally)。

Can we avoid finally block if we do resource cleanup in both try and catch together?

为什么?您可以通过使用错误代码和一些反模式来替换一个工作良好并为此目的设计的 java 习语。

假设,您将在现实生活中记录或处理异常,这就是您的代码不一样的原因:

不工作:

  • 您的连接并不总是关闭,因为您只处理异常,没有错误或可抛出的东西

一些反模式:

  • 你在重新发明轮子
  • DRY(不要重复自己)
  • 首先捕获最具体的异常;一般避免处理 Exception、Error 或 Throwable
  • 注意吞噬异常(finally 也可能!),try-with-resources 为此使用抑制异常
  • ...