我编写了一个将对象写入文件的方法。 我使用了泛型,所以也可以编写一个派生自Object的对象(我也可以接受一个Object类型的参数,但这个更清楚)。
public static <T extends Object> void write(T item,String path)
throws FileNotFoundException,IOException
{
ObjectOutputStream os;
Object obj=item;
os=new ObjectOutputStream(new FileOutputStream(path));
os.writeObject(obj);
os.close();
}
所以怀疑是关于实用的:在没有处理它们的情况下离开异常是正确的吗?因为我还编写了该方法的第二个版本:
public static <T extends Object> void nothrow_write(T item,String path)
{
ObjectOutputStream os;
Object obj=item;
try
{
os=new ObjectOutputStream(new FileOutputStream(path));
os.writeObject(obj);
os.close();
}
catch(FileNotFoundException e)
{
System.out.println(e);
}
catch(IOException e)
{
System.out.println(e);
}
}
哪种方法更实用? 第一个问题是,如果抛出异常,流仍然保持打开状态。
答案 0 :(得分:2)
您可以使用finally块来确保关闭流,同时仍然抛出异常,如果您愿意:
public static <T extends Object> void myMethod(T item,String path) throws FileNotFoundException,IOException
{
ObjectOutputStream os;
Object obj=item;
try
{
os=new ObjectOutputStream(new FileOutputStream(path));
os.writeObject(obj);
}
catch(FileNotFoundException e)
{
throw e; // Perhaps log the error before throwing
}
catch(IOException e)
{
throw e; // Perhaps log the error before throwing
}
finally
{
// Close stream here
}
}
答案 1 :(得分:1)
第一个版本错了。如你所知,这是一个等待发生的资源泄漏:
public static void write() throws Exception
{
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(path));
os.writeObject(obj);
os.close();
}
第二个版本是一个改进 - 至少你正在关闭()。
其他选项包括:
1)关闭文件并将异常重新抛回调用者
2)使用“finally”子句:
http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html
'希望有所帮助......
答案 2 :(得分:1)
public static void write(Object item, String path)
throws FileNotFoundException, IOException
{
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(path));
try {
os.writeObject(obj);
} finally {
os.close();
}
}