findbug中可能的空指针取消引用是什么意思?

时间:2012-09-03 05:10:53

标签: java find sonarqube findbugs

我正在使用声纳,并且我为了我的代码的安宁而受到了这种违规行为:

 Correctness - Possible null pointer dereference  

有没有人知道findbugs中的这个规则?我搜索了很多,但是我找不到描述这条规则的好的示例代码(用Java),遗憾的是findbugs网站没有关于这条规则的任何示例代码或良好的描述。

为什么会出现此违规行为?

5 个答案:

答案 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.