考虑以下代码:
FileOutputStream stream=null;
ObjectOutputStream objStr=null;
try
{
stream=new FileOutputStream(defaultFile);
objStr=new ObjectOutputStream(stream);
objStr.writeObject(obj);
objStr.close();
}
catch(FileNotFoundException e)
{
System.out.println("Il file "+ defaultFile+ " non è stato trovato\n");
}
catch(IOException e)
{
stream.close();
System.out.println("Si è verificato un problema di I/O nell' apertura dello stream");
}
在第二个挡块中,我关闭了流,但我不确定它是否应该关闭
如果ObjectOutputStream的构造函数失败,它会进入第二个catch,但我确定在这种情况下,FileOutputStream是否仍然打开?
我应该写一个finally块来处理所有异常吗?
我很难弄清楚所有情况。
答案 0 :(得分:4)
如果您使用的是Java 7,则可以使用try-with-resources语句来处理所有结算。
try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(defaultFile))) {
oos.writeObject(obj);
} catch (IOException e) {
e.printStackTrace();
}
答案 1 :(得分:2)
在try-catch语句中添加finally块并在那里进行关闭。要避免使用另一个try-catch和nullcheck,可以使用commons.io IOUtils.closeQuietly():
FileOutputStream stream = null;
ObjectOutputStream objStr = null;
try {
stream = new FileOutputStream(defaultFile);
objStr = new ObjectOutputStream(stream);
objStr.writeObject(obj);
} catch (FileNotFoundException e) {
System.out.println("Il file " + defaultFile + " non è stato trovato\n");
} catch (IOException e) {
System.out.println("Si è verificato un problema di I/O nell' apertura dello stream");
} finally {
IOUtils.closeQuietly(stream);
IOUtils.closeQuietly(objStr);
}
答案 2 :(得分:1)
您可以在关闭流之前添加if条件,如下所示
if(stream != null) {
stream.close();
}