最后可以使用try catch吗?

Hir*_*ala 22 java exception-handling

我正在使用缓冲的编写器和我的代码,关闭finally块中的编写器.我的代码是这样的.

 ...........
    BufferedWriter theBufferedWriter = null;
    try{
    theBufferedWriter =.....
    ....
    ......
    .....
    } catch (IOException anException) {
    ....
    } finally {
        try {
            theBufferedWriter.close();              
        } catch (IOException anException) {
            anException.printStackTrace();
            }
    }
Run Code Online (Sandbox Code Playgroud)

最后我必须在清理代码中使用try catch,因为theBufferedWriter也可能抛出IOException.我不想把这个异常抛给调用的方法.最后使用try catch是一个好习惯吗?如果不是什么替代方案?请建议.

问候,Hiral

Edw*_*ale 14

一个更好的方法是使用Apache commons-io中的IOUtils.closeQuiety.它使您的代码保持整洁,并消除了Java中固有的一些样板.

然后您的代码变为:

BufferedWriter theBufferedWriter = null;
try{
    theBufferedWriter = ...
    ...
} catch (IOException anException) {
    ...
} finally {
    IOUtils.closeQuietly(theBufferedWriter);
}
Run Code Online (Sandbox Code Playgroud)

更好,更富有表现力.

  • 关闭像这样的缓冲编写器是有风险的; 如果字符保留在缓冲区中并且在尝试写入时关闭会抛出异常,则数据将被截断,并且您的应用程序不会处理错误.为了使这个安全,你需要在catch块之前调用`close`. (3认同)
  • @McDowell:很高兴知道.大概你也可以在catch块之前调用`flush()`,对吧? (2认同)
  • 关闭缓冲区将刷新它(请参阅javadoc)._如果不清楚,这个模式需要调用两次`close`.如果你将_try/finally {close} _移动到现有的_try_块中,你只需要调用`close`一次2)避免冗余的"null"赋值3)不需要导入第三方库.嵌套的trys看起来很难看,但是你通常无法在本地做出关于错误处理的决定,所以catch块会在调用堆栈的更远处调用.http://illegalargumentexception.blogspot.com/2008/10/java-how-not-to-make-mess-of-stream.html (2认同)

aio*_*obe 12

在Java 7之前,我会说你写的是最好的解决方案.

在Java 7及更高版本中,您可以使用自动资源管理来简化这些操作.有了这个功能,你就可以做到

BufferedWriter theBufferedWriter = null;
try (BufferedWriter theBufferedWriter = ...) {
....
......
.....
} catch (IOException anException) {
....
}
Run Code Online (Sandbox Code Playgroud)