java在finally中关闭资源_Java try/catch/finally获取/关闭资源时的最佳实践

如果你想捕获和报告所有的异常源,一个更好的解决方案是:

ObjectOutputStream oos = null;

try {

oos = new ObjectOutputStream(new FileOutputStream(file));

oos.writeObject(shapes);

oos.flush();

} catch (FileNotFoundException ex) {

// complain to user

} catch (IOException ex) {

// notify user

} finally {

if (oos != null) {

try {

oos.close();

} catch (IOException ex) {

// ignore ... any significant errors should already have been

// reported via an IOException from the final flush.

}

}

}

笔记:

>标准的Java包装器流,读取器和写入器都传播close和flush到它们的包裹流等。所以你只需要关闭或刷新最外面的包装器。

>当您对输出流执行关闭或刷新操作时,由于光盘错误或文件系统已满,将出现“一次在蓝色月亮中”的异常。你不应该挤压这个异常!

如果你经常不得不“关闭一个可能为null的流忽略IOExceptions”,那么你可以写自己一个帮助方法如下:

public void closeQuietly(Closeable closeable) {

if (closeable != null) {

try {

closeable.close();

} catch (IOException ex) {

// ignore

}

}

}

那么你可以替换前面的finally块:

} finally {

closeQuietly(oos);

}

(另一个答案指出,一个closeQuietly方法已经可以在Apache Commons库中…如果你不介意为10行方法添加一个依赖项到你的项目。

但是要小心,你只使用closeQuietly对流的IO异常真的是不相关的。

另一方面,如果你可以使用Java 7或更高版本,那么@Mike Clark的答案中描述的“新”尝试资源是最好的解决方案。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值