我正在使用声纳,并且我为了我的代码的安宁而受到了这种违规行为:
Correctness - Possible null pointer dereference
有没有人知道findbugs中的这个规则?我搜索了很多,但是我找不到描述这条规则的好的示例代码(用Java),遗憾的是findbugs网站没有关于这条规则的任何示例代码或良好的描述。
为什么会出现此违规行为?
答案 0 :(得分:17)
它说here
NP: Possible null pointer dereference (NP_NULL_ON_SOME_PATH)
有一个语句分支,如果执行,则保证将取消引用空值,这将在执行代码时生成NullPointerException。当然,问题可能是分支或语句不可行,并且不能执行空指针异常;决定这超出了FindBugs的能力。
如果您要发布一些代码,那么回答会更容易。
编辑我没有看到很多文档,但这里只有一个example!希望这有帮助!
答案 1 :(得分:12)
示例代码是这样的。
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.
答案 2 :(得分:3)
好的
这是两个简单的例子: 第一个给出:可能的空指针解除引用
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
简单吗?
答案 3 :(得分:1)
在简单语言中,如果将变量值指定为null,并尝试使用任何内置方法(如add / get)访问它。然后SONAR附带空指针解除引用问题。因为它有变化,所以返回null,并抛出空指针异常。尽可能避免使用它。
Ex File file = null; file.getName(); 将抛出“可能的空指针取消引用”
可能不会像示例中提到的那样直接发生,它可能是无意的。
答案 4 :(得分:1)
我用以下代码解决了这个问题: -
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.