我正在使用声纳,我从它那里得到了这种违规行为,以便我的代码和平:
Correctness - Possible null pointer dereference
有人知道 findbugs 中的这条规则吗?我进行了很多搜索,但找不到描述此规则的良好示例代码(Java 中),不幸的是 findbugs 站点没有任何示例代码或有关此规则的良好描述。
为什么会出现这种违规行为?
示例代码是这样的。
String s = null ;
if (today is monday){
s = "Monday" ;
else if (today is tuesday){
s = "Tuesday" ;
}
System.out.println(s.length()); //Will throw a null pointer if today is not monday or tuesday.
好的
这是两个简单的例子:第一个给出一个:可能的空指针取消引用
1. Error
ArrayList a = null;
a.add(j, PointSet.get(j));
// now i'm trying to add to the ArrayList
// because i'm giving it null it gives me the "Possible null pointer dereference"
2. No Error
ArrayList a = new ArrayList<>();
a.add(j, PointSet.get(j));
// adding elements to the ArrayList
// no problem
简单的 ?
用简单的语言来说,如果一个变量值被赋值为 null,并且您尝试使用任何内置方法(如 add/get)来访问它。然后 SONAR 会出现空指针取消引用问题。因为有变化让它为空,并抛出空指针异常。如果可能,尽量避免它。
例如:
File file=null;
file.getName();
将抛出“可能的空指针取消引用”
它可能不会像示例中提到的那样直接发生,它可能是无意的。
我用以下代码遇到了这个问题:-
BufferedReader br = null;
String queryTemplate = null;
try {
br = new BufferedReader(new FileReader(queryFile));
queryTemplate = br.readLine();
} catch (FileNotFoundException e) {
// throw exception
} catch (IOException e) {
// throw exception
} finally {
br.close();
}
在这里,br
BufferedReader 可以null
在br.close()
. 然而,它只能在null
失败new BufferedReader()
时出现,在这种情况下,我们会抛出相关的异常。
因此这是一个错误的警告。Findbugs
文档提到相同的: -
This may lead to a NullPointerException when the code is executed.
Note that because FindBugs currently does not prune infeasible
exception paths, this may be a false warning.