【发布时间】:2011-05-04 19:44:29
【问题描述】:
在做一个学校项目时,我编写了以下代码:
FileOutputStream fos;
ObjectOutputStream oos;
try {
fos = new FileOutputStream(file);
oos = new ObjectOutputStream(fos);
oos.writeObject(shapes);
} catch (FileNotFoundException ex) {
// complain to user
} catch (IOException ex) {
// notify user
} finally {
if (oos != null) oos.close();
if (fos != null) fos.close();
}
问题是 Netbeans 告诉我 resource.close() 行会抛出 IOException ,因此必须被捕获或声明。它还抱怨oos 和fos 可能尚未初始化(尽管进行了空检查)。
这似乎有点奇怪,因为关键是如何将IOException 停在那里。
我的下意识的解决办法是这样做:
} finally {
try {
if (oos != null) oos.close();
if (fos != null) fos.close();
} catch (IOException ex) { }
}
但在内心深处,这让我很困扰,感觉很脏。
我来自 C# 背景,我会简单地利用 using 块,所以我不确定处理这个问题的“正确”方法是什么。
什么是处理这个问题的正确方法?
【问题讨论】:
-
请注意,当
oos.close()抛出IOException时,您的下意识修复不会关闭fos。每个人都需要进行自己的尝试捕获。if (oos != null) try { oos.close() } catch (IOException logOrIgnore) {}等等。 -
@BalusC - 这是一个很好的观点。感谢...抓住...那个:D
-
其实oos.close()也关闭了底层的fos。
-
在 C# 中,您将使用
using,但是从 IDisposable 上的 Dispose 方法抛出的任何异常都会冒泡,因此等效的 Java 将在关闭时抛出 RuntimeException陈述。但我不知道.NET 系统库是否默认吞下此类异常。 -
应该有一个规范的问题 - 有很多非常相似的问题,搜索者/读者很难确定要遵循的问题。一些版主类型可以弄清楚如何合并其中一些问题吗?