2017-11-21 15 views
0

に私は、コードFileInputStreamの誤差はSonarQube

問題がある以下で私が唯一API LEVEL 19+上記のためであるtry-with-resourcesを使用するように示唆sonarqubeをSonarQube重要な問題を取得していますし、私はminimumSDKとしてLEVEL 16を標的としています。

いずれにしても、私はすでに下のコードで行っているブロック内の閉じるFileInputStreamのブロックを示しています。

protected void copyFile(File sourceFile, File destFile) throws IOException { 
    if (!sourceFile.exists()) { 
     return; 
    } 

    FileChannel source = null; 
    FileChannel destination = null; 
    try { 
     source = new FileInputStream(sourceFile).getChannel(); 
     destination = new FileOutputStream(destFile).getChannel(); 
     if (source != null) { 
      destination.transferFrom(source, 0, source.size()); 
     } 

    } finally { 
     if (source != null && destination != null) { 

      source.close(); 
      destination.close(); 
     } 
    } 

} 

でもアンドロイドスタジオは赤いラインのエラーを与え、finallyブロックにtry-with-resources OR近いストリームを使用するために同じことを示唆しています。

UPDATE

Pre check exception by SonarLint

答えて

0

両方がNULLの場合は、2つのチャネルのみを閉じている、とあなたはストリームを閉じていないからです。以下のようなブロックを分離するために近い/チェックを抽出してみてください。sourceまたはdestinationストリームの1つがnullないときのシナリオがありますので

protected void copyFile(File sourceFile, File destFile) throws IOException { 
    if (!sourceFile.exists()) { 
     return; 
    } 

    FileInputStream fis = null; 
    FileChannel source = null; 
    FileOutputStream fout = null; 
    FileChannel destination = null; 
    try { 
     fis = new FileInputStream(sourceFile); 
     source = fis.getChannel(); 
     fout = new FileOutputStream(destFile); 
     destination = fout.getChannel(); 
     if (source != null) { 
      destination.transferFrom(source, 0, source.size()); 
     } 

    } finally { 
     if (fis != null) { 
      try { 
       fis.close(); 
      } catch (IOException e) { 
       System.out.println("Failed to close source input stream."); 
      } 
     } 
     if (source != null) { 
      try { 
       source.close(); 
      } catch (IOException e) { 
       System.out.println("Failed to close source channel."); 
      } 
     } 
     if (fout != null) { 
      try { 
       fout.close(); 
      } catch (IOException e) { 
       System.out.println("Failed to close destination output stream."); 
      } 
     } 
     if (destination != null) { 
      try { 
       destination.close(); 
      } catch (IOException e) { 
       System.out.println("Failed to close destination channel."); 
      } 
     } 
    } 
} 
+0

これを試しても、最後のブロックで閉じるストリームと言うエラーが表示される – Aks4125

+1

申し訳ありませんが、close()が例外をスローする可能性があります。私は答えを更新します。 – fejd

+0

私の更新された質問を確認してください。私はあなたの更新されたソリューションを使用しています。 – Aks4125

1

SonarQubeは重要な問題を与えています。また、FileInputStreamオブジェクトを閉じず、チャンネルを閉じるだけではありません。その場合は、それを閉じることはありませんFileChannel

1:@fejdが提案されているようのFileChannelのスプリット近いあなたが次の操作を行うことができ、これを避けるために

if (source != null && destination != null) {...} 

:この行を参照してください。

2:ネストされたtry-catchブロック、各finallyブロックはストリームを閉じます。

一般的な注意点として、より複雑なシナリオでは2を使用できますが、指定されたものについては1で十分です。

+0

@ fejdの答えとポイント2を試しましたが、それでもエラーが出ます。 :( – Aks4125