2016-11-15 88 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