美文网首页
关于Null的翻车现场

关于Null的翻车现场

作者: antony已经被占用 | 来源:发表于2020-01-11 23:02 被阅读0次

最近笔者为了促进开发人员对于SonarQube扫描出的缺陷的重视程度,准备陆续整理了一些典型的问题。首先整理的是关于Null的几个问题,供读者参考。
由于考虑到不能直接贴公司源码,首先选用了SonarQube为规则提供的示例代码,如果没有,就自己按照翻车现场编写了伪代码,可能也不是很贴切。欢迎读者留言提供更多和更为典型的案例。我会继续更新下去。

1 Null pointers should not be dereferenced

@CheckForNull
String getName(){...}

public boolean isNameEmpty() {
  return getName().length() == 0; 
// Noncompliant; the result of getName() could be null, but isn't null-checked
}

@CheckForNull只是一个提醒哦。

Connection conn = null;
Statement stmt = null;
try{
  conn = DriverManager.getConnection(DB_URL,USER,PASS);
  stmt = conn.createStatement();
  // ...

}catch(Exception e){
  e.printStackTrace();
}finally{
  stmt.close();   // Noncompliant; stmt could be null if an exception was thrown in the try{} block
  conn.close();  // Noncompliant; conn could be null if an exception was thrown
}

并不是有了finally就可以高枕无忧了。

2 Conditionally executed blocks should be reachable

这个案例的问题是对于Null的问题的反例,虽然写了对于null的处理,但是这段代码是不会被执行的。

Response rsp= Httputil.doSomeQuery(url)
if (rsp==null) { // Noncompliant
  doSomething(); // never executed
}

在项目中,由于此处的rsp无论如何都不会是Null,因此底下的额外代码属于永远不会被执行的废代码。

3 Call to equals(null)

public void checkResponse(Response rsp)
if (rsp.equals(null)) { // Noncompliant
  doSomething(); // 翻车
} else{
//...
}

在上述代码中,如果rsp不为null, 那么rsp.equals(null)一定只会返回false。而如果rsp是null的话,这行代码将会抛出NullPointerException。
因此,正确地进行Null的判断应该使用==,而不是equals。

4 Nullcheck of value previously dereferenced

还是以上述代码为案例,这里的问题是一目了然的。这位开发同学在写代码的时候搞反了两个判断的顺序。如果rsp是null的话,NullPointerException异常又来了。

public void checkResponse(Response rsp)
if (rsp.getErrorCode()==0 || null !=rsp)) { // Noncompliant
  doSomething(); 
} else{
//...
}

5 Method call passes null for nonnull parameter

这个问题也是一个逻辑错误导致的。例如

public boolean accept(String name) {
            String result = null;
            if (name == "张三") {
                result = "zhangsan";
            } else if (name == "李四") {
                     result = "lisi";
            }
            
           return result.size() //翻车
}

这里如果name 既不是张三,也不是李四,由于程序员忘记了赋一个默认值,导致了有可能result还是null, 抛异常。

6 Possible null pointer dereference in method on exception path

沿用之前数据库连接的案例。

Connection conn = null;
Statement stmt = null;
try{
  conn = DriverManager.getConnection(DB_URL,USER,PASS);
  stmt = conn.createStatement();
  // ...

}catch(Exception e){
  e.printStackTrace();
  stmt.close();   // Noncompliant; stmt could be null if an exception was thrown in the try{} block
  conn.close();  // Noncompliant; conn could be null if an exception was thrown
}

这是新手程序员常见地在catch中关闭资源。但是由于某些异常,stmt还是null。

相关文章

  • 关于Null的翻车现场

    最近笔者为了促进开发人员对于SonarQube扫描出的缺陷的重视程度,准备陆续整理了一些典型的问题。首先整理的是关...

  • 翻车现场

    菜市场的那个卖菜的阿姨,因为骑电三轮从一个转弯处摔倒,送去了医院。 这个阿姨年纪挺大了,之前又有过中风的情况,本来...

  • 翻车现场

    看到午饭吃了2碗米饭的小石还在不停往嘴里送饼干,孩妈又气又笑地说“看你胖的,还吃!将来哪个女孩喜欢你呦?”人特淡定...

  • 现场翻车

    这次开车 帮车给开翻了地里,这也算拿到驾照来的特别特殊的一次经历。 这次开车,让我有了一些心里压抑感。 实在是很伤...

  • 翻车现场

    下午本来计划好要给组织脱水,然后发现似乎试剂太少了,于是便请教了实验室里的其他人,于是补充了试剂。奇怪的是新补充的...

  • 翻车现场

    好久没包饺子了,竟然有些怀念,今天包了三鲜馅饺子,竟然翻车了。 在这个炎热的六月底,已经是躺平也是汗流浃背...

  • 水彩涂鸦7

    不要求线稿,翻车现场

  • 大型翻车现场

  • 大型“翻车”现场

    讲完了杜甫的《登高》,给同学们布置了一个作业:试将《登高》散文化,写一篇600字的片段。 我的课代表,擅长写作的小...

  • 大型翻车现场……

    ① 减肥对我最大的影响,是把我从一个心安理得的胖子,变成一个减肥失败充满负罪感和挫败感的胖子。 ② 最近,我开始教...

网友评论

      本文标题:关于Null的翻车现场

      本文链接:https://www.haomeiwen.com/subject/ejebactx.html