2012-03-31 9 views
1

は、このコードを検討し、それを開いていた場合にのみ:二catchブロックでは、ストリームを閉じる

FileOutputStream stream=null; 
    ObjectOutputStream objStr=null; 
    try 
    { 
     stream=new FileOutputStream(defaultFile); 
     objStr=new ObjectOutputStream(stream); 
     objStr.writeObject(obj); 
     objStr.close(); 
    } 
    catch(FileNotFoundException e) 
    { 
     System.out.println("Il file "+ defaultFile+ " non è stato trovato\n"); 
    } 
    catch(IOException e) 
    { 
     stream.close(); 
     System.out.println("Si è verificato un problema di I/O nell' apertura dello stream"); 
    } 

を、私はストリームを閉じるが、私はそれがクローズするかどうかわかりません。
ObjectOutputStreamのコンストラクタが失敗した場合、2番目のcatchに入りますが、この場合はFileOutputStreamが開いたままになっていますか?
すべての例外を処理するfinallyブロックを作成しますか?
すべてのケースを把握するのは難しいです。

答えて

4

Java 7を使用している場合は、try-with-resourcesステートメントを使用して、すべての処理を処理できます。

try(ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(defaultFile))) { 
    oos.writeObject(obj); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

ストリームをどこで閉じるのですか? –

+0

@Ramy AI Zuhouri try-with-resourcesステートメントは、ブロックが終了したときにストリームを閉じます。私があなたに与えたリンクを読んでください。 – Jeffrey

1

あなたは

if(stream != null) { 
    stream.close(); 
} 
2

は最終的にあなたのtry-catchステートメントにブロックし、そこに閉鎖を行うの追加次のようにストリームを閉じる前であれば条件を追加することができます。別のtry-catchとnullcheckを避けるには、commons.ioを使用できます。IOUtils.closeQuietly()

FileOutputStream stream = null; 
    ObjectOutputStream objStr = null; 
    try { 
     stream = new FileOutputStream(defaultFile); 
     objStr = new ObjectOutputStream(stream); 
     objStr.writeObject(obj); 
    } catch (FileNotFoundException e) { 
     System.out.println("Il file " + defaultFile + " non è stato trovato\n"); 
    } catch (IOException e) { 
     System.out.println("Si è verificato un problema di I/O nell' apertura dello stream"); 
    } finally { 
     IOUtils.closeQuietly(stream); 
     IOUtils.closeQuietly(objStr); 
    }  
関連する問題