在finally部分使用try catch

9

在 finally 子句中编写 try 和 catch 是否被视为不良编程?

在我的主方法中,我有一个 fileInputStream 需要关闭。我想将 .close() 放在 finally 中,这样无论如何它都会关闭。我不想在主方法中添加 throws 声明,因为它是主方法 :P

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

你好,是否可以?谢谢。


8
可以,有时候这是必要的。 - Hovercraft Full Of Eels
1
如果你只是要重新抛出异常,那么你就不需要try catch。try catch是必须的,因为你应该对异常进行处理(至少记录日志),如果你决定不这样做,那么它就不是必需的。 - SJuan76
3
请参考Java官方文档中的try-with-resource部分,链接为http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html - Java42
1
如果你问我,这是一种不好的编程习惯。它会使代码难以阅读且冗长。这种构造方式给Java带来了不好的声誉。 - Mike Braun
1
通常情况下,您希望将try-catch放在整个try-finally(以及资源获取)的周围。执行环绕惯用语是一种方便的方法,可以避免重复这种事情(尽管它过于冗长,直到Java SE 8)。 - Tom Hawtin - tackline
显示剩余2条评论
1个回答

9
很不幸,在Java 6及其之前,需要在finally方法中使用try/catch是一个反复出现的模式。我认为这实际上是一种不良做法,但在Java 6中你无法避免(有关Java 7的信息请见下文)。
另一个问题是,在finally块中抛出的任何新异常都将覆盖在此块之前抛出的异常。
在Java 7中,专门为需要关闭资源的情况(大多数使用try/finally/try/catch结构的情况)提供了新的try-with-resources结构。它还会捕获主要和次要异常。
因此,在JDK 7中,使用此结构现在是最佳实践,而且,你展示的代码在Java 7中是一种不良实践。

我只能使用Java 6,学校还没有批准使用7。 - La bla bla

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