findbugs:可能存在空指针取消引用警告

时间:2018-07-26 13:49:40

标签: java

我的findbugs报告中有Possible null pointer dereference in convertMultiPartToFile(MultipartFile) due to return value of called method [line 91]

代码如下:

private File convertMultiPartToFile(MultipartFile file) throws IOException {
        //line below is the line 91
        if (file == null || file.getOriginalFilename() == null)
            throw new InputValidationException("fileNameInvalid", i18n, file.getOriginalFilename());
        File convFile = new File(file.getOriginalFilename());
        FileOutputStream fos = new FileOutputStream(convFile);
        fos.write(file.getBytes());
        fos.close();
        return convFile;
}

我已经检查了文件的空值,为什么仍然收到警告?

更新1:

删除异常中的文件名后,在下面的行中仍显示警告。

private File convertMultiPartToFile(MultipartFile file) throws IOException {           
        if (file == null || file.getOriginalFilename() == null)
            throw new InputValidationException("fileNameInvalid", i18n, "");
        File convFile = new File(file.getOriginalFilename()); // warning here
        FileOutputStream fos = new FileOutputStream(convFile);
        fos.write(file.getBytes());
        fos.close();
        return convFile;
}

更新2:

private File convertMultiPartToFile(MultipartFile file) throws IOException {
    File convFile = null;
    if (file != null && file.getOriginalFilename() != null) {
        convFile = new File(file.getOriginalFilename()); //line 91
        try (FileOutputStream fos = new FileOutputStream(convFile);) {
            fos.write(file.getBytes());
        }
    }
    return convFile;
}

适应@Michael Peacock的答案,警告仍然存在。

  

由于调用方法的返回值,可能会在convertMultiPartToFile(MultipartFile)中取消空指针的引用

     

错误类型NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE(单击以获取详细信息)   在com.corpobids.server.service.AwsAPIService类中   在方法convertMultiPartToFile(MultipartFile)

     

存储在JVM寄存器中的局部变量?

     

在Service.java上调用的方法:[第91行]

     

在Service.java中为空:[第91行]

2 个答案:

答案 0 :(得分:2)

这里有几件事。首先,您需要确保要关闭FileOutputStream。根据您使用的JDK,此操作的执行方式有所不同。在JDK 1.7之前,您将使用finally块关闭fos。从JDK 1.7开始,请尝试使用资源。

此外,仅在需要处理时才继续进行文件处理。我尚未测试此代码,但这应该可以消除可能的NPE。请注意我们如何翻转条件,以便在可能的情况下跳过对文件的处理。

JDK <= 1.6:

private File convertMultiPartToFileJDK16(MultipartFile file) throws IOException {           

    File convFile = null;
    FileOutputStream fos = null;

    if (file != null && file.getOriginalFilename() != null) {
        try {
            String originalFilename = file.getOriginalFilename();
            if (originalFilename != null) { 
               convFile = new File(originalFilename); 
               fos = new FileOutputStream(convFile);
               fos.write(file.getBytes());

        }
        catch(IOException ex){
                // handle IOException or rethrow it
        }
        finally {
            fos.close();
        }
    }
    return convFile;
}

JDK> = 1.7:

private File convertMultiPartToFileJDK17(MultipartFile file) throws IOException {           
    File convFile = null;
    if (file != null && file.getOriginalFilename() != null) {

        String originalFilename = file.getOriginalFilename();
        if (originalFilename != null) { 
           convFile = new File(originalFilename); 

           try(FileOutputStream fos = new FileOutputStream(convFile);) {
              fos.write(file.getBytes());
           }
         }
    }
    return convFile;
}   

答案 1 :(得分:0)

编辑:我想我仍在考虑使用file != null,所以这可能是不正确的。让我知道是否单独打破条件不能解决警告,我将更新/删除此答案。

原始: 一旦任何条件评估为真,则or条件将短路。在这种情况下,您可能有一个非null的MultipartFile对象,其对象“ file.getOriginalFilename()”的计算结果为null。

条件语句确定file != null时,它将跳过throw子句并下降到下一行。此时,您将把null传递给File()构造函数(同样,假设您有一个非null文件,但nullFileName字段为空)。

FindBugs模块不喜欢将可能取消引用的值传递到File()构造函数的想法。单独评估条件并在每个条件中采取相应措施会更安全:

if (file == null) {
    throw new InputValidationException("fileObjectIsNull", i18n, "")
}

if (file.getOriginalFilename() == null) {
    throw new InputValidationException("fileNameInvalid", i18n, "");
}

File convFile = new File(file.getOriginalFilename());