2017-10-06 15 views
0

ソナーはfileStreamが以下のコードで閉じられていないという問題を提起します。しかしそれはラムダ式ですが、ソナーの問題を解決する方法:ストリームが実際に閉じられているがラムダで閉じられていない場合

try { 
       final InputStream fileStream = new FileInputStream(copy); 
       return (OutputStream outputStream) -> { 
        int n; 
        byte[] buffer = new byte[1024]; 
        while ((n = fileStream.read(buffer)) > -1) { 
         outputStream.write(buffer, 0, n); 
        } 
        fileStream.close(); 
       }; 
      } catch (IOException exception) { 
       ... 
      } 

私はそれを変更して使用してみてください-リソースとパターン、私は例外を取得:にjava.io.IOException:ストリームクローズを読んでFILESTREAMの行に:

try (final InputStream fileStream = new FileInputStream(copy)) {     
      return (OutputStream outputStream) -> { 
       int n; 
       byte[] buffer = new byte[1024]; 
       while ((n = fileStream.read(buffer)) > -1) { 
        outputStream.write(buffer, 0, n); 
       }      
      }; 
     } catch (IOException exception) { 
      ... 
     } 

したがって2番目の解決策はソナーによって検出されたバグを解決しますが、ラムダコードが呼び出される前にfileStreamがクローズされても機能しません。

あなたはそれを修正するために何をお勧めしますか?

+0

例外が発生した場合、outputStream.close()の呼び出しが完了する前にメソッドが飛び出すことがあります。 catchコマンドにcloseコマンドを追加するか、try-with-resourceを使用してこれを修正してください。 – Korashen

答えて

0

@Krashenのコメントで指摘したように、最初のバージョンでは、close()が呼び出される前に例外がスローされる可能性があります。

セクションバージョンでは、メソッドのtry-with-resourcesにInputStreamが作成され、それをラムダ式の一部として返そうとします。しかし、リソースを試してみるとリソースが確実に閉じられ、私が知る限り、メソッドが終了する直前に終了します。明示的に、発信者がreturnエドラムダを受信するまでには、InputStreamはすでに閉じられています。

だから、ラムダからロジックを抽出して結果を返すか、ラムダ結果を変数に代入してその変数を返すのが最善の方法です。後者を実行するとS1488から問題が発生する可能性があります(ローカル変数を宣言してからすぐに返すかスローしないでください)。

関連する問題