2011-02-25 41 views
4

的處理文件的閱讀和使用Java語言編寫的標準方法是這樣的:的java文件處理和異常

try 
{ 
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file.dat")); 
    oos.writeObject(h); 
    oos.close(); 
} 
catch (FileNotFoundException ex) 
{ 
} 
catch (IOException ex) 
{ 
} 

但我通過代碼困擾,因爲它可能是可能在這裏該文件從未關閉,如果拋出異常。當然,我們可以添加一個finally子句並在try塊外面初始化ObjectOutputStream。然而,當你這樣做時,你需要再次添加另一個try/catch塊再次嵌入finally塊中......這很醜陋。有沒有更好的方法來處理這個問題?

+0

添加另一個try/catch塊可以幫助您隔離時的問題發生異常 – Alpine

+1

@Alpine對堆棧跟蹤提供的信息沒有任何幫助* * ^^^ – corsiKa

+0

@Nathan Hughes:我的部分的表述不好,意識到危險,但感謝您指出了這一點。 – Rene

回答

3

這就是我使用commons-io的IOUtils.closeQuitely(...)

try 
{ 
... 
} 
finally 
{ 
    IOUtils.closeQuietly(costream); 
} 
+0

看起來有趣,謝謝! – Rene

0
try 
{ 
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file.dat")); 
    oos.writeObject(h); 
    //oos.close(); // glow coder removed 
} 
catch (FileNotFoundException ex) 
{ 
} 
catch (IOException ex) 
{ 
} 
// glowcoder adds: 
finally { 
    try { 
     oos.close(); 
    } 
    catch(IOException ex) { 
     // dammit we tried! 
    } 
} 
+0

工程,但這正是我想要避免做的。 – Rene

+0

@Rene你究竟想要避免什麼,爲什麼你想避免它? – corsiKa

+0

正如我在我的問題中寫的,我只是認爲這種方式很難看,創建了一個巨大的代碼塊,用於處理3條語句的異常。所以我的問題純粹是關於編碼風格,也許我對它太挑剔了;)感謝您的迴應無論如何:) – Rene

0

添加此最後:

finally{ 
    if(oos != null) 
     oos.close(); 
} 
+0

您需要添加另一個嘗試...趕上這裏,這正是我想避免 – Rene

6

這不是標準的辦法都沒有。這是不好的方法。

我用大部分時間的方式是這樣的一個:

ObjectOutputStream out = null; 
try { 
    out = new ObjectOutputStream(new FileOutputStream("file.dat")); 
    // use out 
} 
finally { 
    if (out != null) { 
     try { 
      out.close(); 
     } 
     catch (IOException e) { 
      // nothing to do here except log the exception 
     } 
    } 
} 

finally塊中的代碼可以放在一個輔助方法,也可以使用commons IO悄然關閉流,如在其他答案中指出。

流必須始終在finally塊中關閉。

注意JDK7將使它更具有新的語法,這將在try塊結束時自動關閉流簡單:

try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("file.dat"))) { 
    // use out 
} 
+0

上午意識到不在finally塊中關閉它是有風險的,因此我的問題。但將其命名爲標準方式確實是一個糟糕的表述。然而,JDK7信息對我來說是新的,而且看起來很有趣。這與C#使用的使用{}語法相媲美,以防您或某人知道這兩種語言? – Rene

+0

我不知道C#,但它就像Python的'with'語法。 http://www.python.org/dev/peps/pep-0343/ – z0r