- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于 findbugs 报告中被调用方法的返回值 [第 91 行],我在 ConvertMultiPartToFile(MultipartFile) 中得到了可能的空指针取消引用。
这是代码:
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的答案,警告仍然存在。
Possible null pointer dereference in convertMultiPartToFile(MultipartFile) due to return value of called method
Bug type NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE (click for details) In class com.corpobids.server.service.AwsAPIService In method convertMultiPartToFile(MultipartFile)
Local variable stored in JVM register ?
Method invoked at Service.java:[line 91]
Known null at Service.java:[line 91]
最佳答案
这里有几件事。首先,您需要保证要关闭 FileOutputStream。根据您使用的 JDK,此操作的完成方式有所不同。在 JDK 1.7 之前,您可以使用 finally block 来关闭 fos。从 JDK 1.7 开始,对资源使用 try。
此外,仅在有需要处理的情况下才继续进行文件处理。我还没有测试过这段代码,但这应该可以消除可能的 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 ) {
String originalFilename = file.getOriginalFilename();
if (originalFilename != null) {
convFile = new File(originalFilename);
try(FileOutputStream fos = new FileOutputStream(convFile);) {
fos.write(file.getBytes());
}
}
}
return convFile;
}
关于java - 查找错误 : Possible null pointer dereference warning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51540471/
*&x 是否总是等于 x?如果不是,什么时候不是? &*x 是否总是等于 x?如果不是,什么时候不是? 我的猜测是 (1) 总是正确的,但 (2) 并不总是正确的,因为 x 可能并不总是一个指针,所以
这段代码: int main(char[][] args) { MyObject obj; obj.x; return 0; } 给我:Error: null dereference in
我想减少使用 XMLHttpRequest() 从服务器获取信息的 I/O 开销或ActiveXObject()视情况而定,通过创建一个通用函数来执行提取,然后使用 sessionStorage. 存
我对以下代码有疑问: #!/usr/bin/perl use strict; use warnings; my %dmax=("dad" => "aaa","asd" => "bbb"); my %d
int main() { char test[15] = "Hallo World"; test[1] = *"e"; } 要将第二个字母更改为 e,我必须遵循字符串 "e"。我找不到
我正在尝试通过实现一些基本数据结构来学习 Rust。在本例中,是一个 Matrix。 struct Matrix { pub nrows: uint, pub ncols: uint, p
Editor's note: This code example is from a version of Rust prior to 1.0 and is not valid Rust 1.0 co
我刚刚阅读完 rust-lang.org 上的生命周期指南并尝试实现该示例(但使用通用枚举来增加一点复杂性)。 enum PositionInfo { Position(T, T), } en
在 JavaScript 中,如何取消引用函数返回的对象? 例如: var tmp = getTextProperties(); font = tmp.font; size = tmp.siz
我是 C++ 的新手,作为练习(也许最终是 .Net 实用程序),我正在做一个指针包装器(实际上是在 C++/CLI 中,但这也适用于 C++)。这个指针包装器(称为 Apont)目前的行为就像一个指
表达式 &ptr->fld不代表取消引用,而是应将其视为 (uint32_t)ptr + offsetof (ptr, fld) .我确信 GCC 做了这种简化,但我找不到代码中的位置。 以上结果为
我现在正在试验 Rust,我真的被各种随机的编译器错误绊倒了,比如这个: error: cannot move out of dereference of `&`-pointer return
我是 Rust 的新手,正在尝试编写命令行实用程序作为学习的一种方式。 我正在获取 args 的列表并尝试匹配它们 let args = os::args() //some more code mat
我目前正在为 C 语言开发一个简单的克隆检测器,用 C++ 编写,并且不断地问自己关于效率和如何优化 C++ 代码的问题。 我有一个问题是关于如何有效地传递结构。如果给出类似于以下内容的结构: typ
我在 C# 中有一些代码使用这样的结构: ArrayList addrs = new ArrayList(); byte[] addr = new byte[8]; while (oneWire.Se
这个问题在这里已经有了答案: What's the meaning of * and & when applied to variable names? (1 个回答) 关闭 6 年前。 刚接触 C
在 boost::filesystem 中,path 类总是尝试解引用符号链接(symbolic link)。许多 API 都是为了让符号链接(symbolic link)看起来不可见。我猜他们下面的
我正在尝试使用 C# 委托(delegate)实现撤消功能。基本上,我有一个 UndoStack,它维护一个实现每个撤消操作的委托(delegate)列表。当用户选择 Edit:Undo 时,此堆栈弹
我有一个工作正常的记录器,但在内存分配方面产生了相当多的开销。下面的 Debug() 函数不是故意打印的,因为 logOutputLevel 不够高。 var logOutputLevel = 2 f
我有这个 C 代码: #include #include
我是一名优秀的程序员,十分优秀!