2016-11-15 132 views
0

我有下面的代碼:資源應該被關閉 - 聲納

public static byte[] readSomeFile(String filePath) { 
byte[] buffer = new byte[FILE_SIZE]; 
FileInputStream fileIn = null; 
BufferedInputStream buffIn = null; 
DataInputStream inData = null; 

int size = 0; 
byte[] someArray= null; 
try { 
    fileIn = new FileInputStream(filePath); 
    buffIn = new BufferedInputStream(fileIn); 
    inData = new DataInputStream(buffIn); 
    size = inData.read(buffer, 0, FILE_SIZE); 
    someArray= new byte[size]; 
    System.arraycopy(buffer, 0, someArray, 0, size); 
} catch (IOException e) { 
    //log(Log.ERROR,"IO ERROR: " + e.toString()); 
} finally { 
    try { 
    if (null != fileIn) { 
    fileIn.close(); 
    } 
    if (null != buffIn) { 
    buffIn.close(); 
    } 
    if (null != inData) { 
    inData.close(); 
    } 
    } catch (Exception exFinally) { 
    // some stuff 
    someArray= null; 
    } 
} 
return someArray; 
} 

問題是聲納仍然抱怨fileIn沒有被關閉,雖然它在finally塊中的第一資源解決。

Sonar在這種情況下如何工作?以及如何解決資源應該關閉規則?

+0

我不知道這是否會解決這個問題,聲納,但你並不需要'試穿catch'你'finally'子句中 - 根據https://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html – nbokmans

+1

只是檢查'InputStream'對象是否爲null並關閉它們,如果不夠的話請添加exFinally.printStackTrace()在catch塊中查看是否在關閉資源期間發生任何異常 – diufanman

回答

1

如果您必須使用Java 7或更高版本,我寧願您使用try with resources這是在Java 7中引入的新功能。

Java 7Try-with-resources是一個新的exception處理機制,使被內try-catch block.

至於你的代碼中使用更容易正確地關閉資源:

finally { 
    try { 
    if (null != fileIn) { 
    fileIn.close(); 
    } 
    if (null != buffIn) { 
    buffIn.close(); 
    } 
    if (null != inData) { 
    inData.close(); 
    } 
    } catch (Exception exFinally) { 
    // some stuff 
    someArray= null; 
    } 
} 

你注意到那個醜陋的雙嘗試?

但是,如果你使用的try with resourcesclose()被自動調用,如果throwsException與否,將supressed (as specified in the Java Language Specification 14.20.3)。你的情況也一樣。我希望它有幫助。

所以,你的代碼將看起來像:

public static byte[] readSomeFile(String filePath) { 
     byte[] buffer = new byte[FILE_SIZE]; 
     int size = 0; 
     byte[] someArray= null; 
     try (FileInputStream fileIn = new FileInputStream(filePath); 
       BufferedInputStream buffIn = new BufferedInputStream(fileIn); 
       DataInputStream inData = new DataInputStream(buffIn);) { 

      size = inData.read(buffer, 0, FILE_SIZE); 
      someArray= new byte[size]; 
      System.arraycopy(buffer, 0, someArray, 0, size); 
     } catch (IOException e) { 
      //log(Log.ERROR,"IO ERROR: " + e.toString()); 
     } 
     return someArray; 
    } 
+0

謝謝,但是這裏的問題是,如果使用.close()方法存在問題時,我想返回null,這是無法執行的試用資源機制。 – TheByeByeMan

+1

你可以只返回在你的方法中初始化的someArray。它不需要檢查關閉或不。如果在方法中發生任何錯誤,您的程序開放資源必須關閉。想想看。 –

+0

好吧,聽起來不錯,讓我先試試:) – TheByeByeMan