3

たとえば、入力/出力ストリームを操作する方法があります。

    public void doSomethingWithStreams () throws FileNotFoundException, IOException
            {
             OutputStream out1, out2;            
             InputStream in1, in2;
try{                     
            //do something with Streams: read, write, process, etc.
            }
finally{
        //There I try to close connections
        out1.close();
        out2.close();
        in1.close();
        in2.close();
        }    
            }

メソッドはIOExceptionをスローする可能性があり、これは有効な動作です。しかし、この行に例外がある場合:

 out1.close();

他の3つのストリームは閉じられません。どのような解決策をお勧めできますか?どのように?すべてにどれだけ近いですか?

私は1つだけ持っています:

    public void doSomethingWithStreams () throws FileNotFoundException, IOException
            {
             OutputStream out1, out2;            
             InputStream in1, in2;
         try{            
            //do something with Streams: read, write, process, etc.
            }
finally{
        //There I try to close connections

try{out1.close();}
  finally{
     try{out2.close();}
         finally{
            try{in1.close();}
                finally{
        in2.close();}
}}

}

            }

ご覧のとおり、私のアプローチは複数のtry-finallyブロックを使用しています。

いい考えだと思いますか?

4

3 に答える 3

6

3 つのストリームが相互に依存していない場合、各ストリームの try/catch がよりきれいに見える可能性があります。

何かのようなもの:

try{
 out1.close();
}catch(Exception e)
{
....
}finally

{....}

try{
        out2.close();
}catch(Exception e)
{
.....
}finally

{....}

編集: iccthedral が示唆したように、Java7 を使用する場合は、try-with-resourceブロックを使用できます。

于 2012-09-11T15:14:56.967 に答える
2

おそらく、それを行うための最良の方法は次のとおりです。

try (
     OutputStream out1 = ...;
     OutputStream out2 = ...;
     InputStream in1 = ...;
     InputStream in2 = ...;
) {
     ...
}
于 2012-09-11T15:17:12.380 に答える
2

おそらく、これをクリーンアップする最良の方法は、次のようなメソッドを作成することです。

public static void close(Closeable c) {
   if (c == null) return; 
   try {
       c.close();
   } catch (IOException e) {
       // Do anything or nothing
   }
}

これは .close() 呼び出しを置き換えることができ、失敗しても例外をスローしません。

于 2012-09-11T15:19:02.017 に答える