【问题标题】:try catch in finally section在 finally 部分尝试 catch
【发布时间】:2012-04-01 14:11:03
【问题描述】:

在 finally 子句中编写 try 和 catch 是否被认为是糟糕的编程?

我的 main 方法中有一个我想关闭的 fileInputStream。 我想将 .close() 放在最后,所以无论如何它都会关闭。我不想在 main 方法中添加 throws 声明,因为它是 main 方法:P

    }finally{
        try {
            commandFile.close();
        } catch (IOException e) {
            throwException(e);
        }
    }

还好吗? 谢谢

【问题讨论】:

  • 是的,这没关系,有时是必要的。
  • 如果你只是要重新抛出异常,你不需要 try catch。 try catch 是必要的,因为你应该对异常做一些事情(至少,记录它),如果你决定不这样做,那就没有必要了。
  • 还可以考虑在docs.oracle.com/javase/tutorial/essential/exceptions/…尝试使用资源
  • 如果你问我,这是一个不好的做法。它使代码难以阅读和冗长。这种结构给 Java 带来了坏名声。
  • 通常,您希望在整个 try-finally (以及资源​​获取)周围使用 try-catch。 Execute Around Idiom 是一种避免重复此类事情的便捷方法(尽管它过于冗长,可能直到 Java SE 8 为止)。

标签: java try-catch-finally


【解决方案1】:

不幸的是,在 finally 方法中需要 try/catch 的模式在 Java 6 及之前的版本中反复出现。我认为这实际上是一种不好的做法,但在 Java 6 中不是可以真正避免的(请参阅下面的 Java 7)。

另外一个问题是,finally 块中抛出的任何新异常都会覆盖到达此块之前抛出的异常。

在 Java 7 中,新的 try-with-resources 结构专门针对需要关闭资源的情况(try/finally/try/catch 结构的大多数用例)。这还将捕获主要和次要异常。

因此,使用这种结构现在是 JDK 7 中的最佳实践,是的,您展示的代码因此在 Java 7 中是一个不好的实践。

【讨论】:

  • 我有义务只使用 Java 6。学校还没有批准 7。
猜你喜欢
  • 2019-07-06
  • 2010-11-23
  • 2010-09-12
  • 2014-04-19
  • 1970-01-01
  • 2014-11-27
  • 2016-10-07
  • 2014-12-22
  • 1970-01-01
相关资源
最近更新 更多