如果你想捕获和报告所有的异常源,一个更好的解决方案是:
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的答案中描述的“新”尝试资源是最好的解决方案。