我的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行]
答案 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());