2011-02-25 18 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スタックトレースによって提供される情報以外には何も助けにならない\ * shrug \ * – corsiKa

+0

@Nathan Hughes:危険を認識しているが、それを指摘してくれてありがとう。 – Rene

答えて

8

使用Apacheのコモンズ自分のfileutilsクラスで

http://commons.apache.org/proper/commons-io/

見IO。金がいっぱい。私が言うの金....

+0

Apacheのコモンズは最高です。ネストされたtryキャッチを書く必要はありません –

+0

面白いですね、ありがとう! – Rene

+0

@suresh、はい、彼らはそこそこで良い仕事をします – hvgotcodes

3

これを私は最終的にこれを追加コモンズ-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ブロック内のコードは、ヘルパーメソッドに入れることができるかのように、静かにストリームを閉じるためにIOコモンズを使用することができます他の回答に記載されています。

ストリームは常にfinallyブロックで閉じる必要があります。 JDK7が自動的にtryブロックの最後にストリームをクローズする新しい構文を持つことが非常に容易になります

注:

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

最終的なブロックでそれを閉じることは危険であることを認識しています。しかし、それを標準的な方法で命名するのは実際には悪い策です.JDK7の情報は私には新しく、興味深いものです。これは、あなたや誰かが両方の言語を知っている場合に、C#が使用する{}構文の使用に匹敵しますか? – Rene

+0

C#については分かりませんが、Pythonの 'with'構文と似ています。 http://www.python.org/dev/peps/pep-0343/ – z0r