2012-02-20 50 views
0

我写了一个将对象写入文件的方法。 我使用泛型,所以也可以编写一个从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);  
    } 
} 

哪一种方法更务实正确? 第一个问题是,如果引发异常,则流将保持打开状态。

+2

使用这样的泛型不会使任何se对我来说。这比'void write(Object,String)'更清晰吗? – 2012-02-20 00:09:15

+0

_是的,你是对的。我认为我使用泛型只是为了更清楚,它也可以接受一个Object._ – 2012-02-20 00:12:47

+0

流在第二个例外中仍然是异常打开的。 – fgb 2012-02-20 00:25:57

回答

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(); 
    } 
} 
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 
    } 

} 
+0

难道你不应该只是将os.close()从最后的尝试中移走? – mck 2012-02-20 00:08:41

+0

更新中......我只是复制粘贴他的例子,错过了那个 – 2012-02-20 00:09:23

1

第一个版本是错误的。正如你指出,这是一个资源泄漏等待发生:

public static void write() throws Exception 
{ 
    ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(path)); 
    os.writeObject(obj); 
    os.close(); 
} 

第二个版本是一个进步 - 至少你做了密切的()。

其他选项包括:

1)关闭文件并重新抛出异常返回给调用者

2)用 “终于” 条款:

http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

“希望有所帮助...

+0

“finally块”还是比'try-with-resources'块更好的练习吗? – 2012-02-20 00:12:39

+0

try-with-resources仅限于Java 7。这对你来说可能很好。但是世界上大部分地区仍然使用Java 6(和更老的版本)。而现在甲骨文已经接管了Java,目前还不清楚Java 7采用会多快发生......恕我直言...... – paulsm4 2012-02-20 01:49:54