2012-02-20 36 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