【问题标题】:Sonar Equals Avoid Null ViolationSonar Equals 避免 Null 违规
【发布时间】:2015-03-11 08:59:29
【问题描述】:

修复声纳违规并收到警告“等于避免空值:
字符串文字表达式应该在等号比较的左侧。" for:

if (title != null && !title.equals("")) {
//rest of loop
}

我改成:

if(!("").equals(title) && title != null){
//rest of loop
}

这样的改变好吗?它会修复违规行为吗?有人可以向我解释为什么原件是违规的吗?我不明白这个问题并已阅读: https://sonar43.spring.io/rules/show/checkstyle:com.puppycrawl.tools.checkstyle.checks.coding.EqualsAvoidNullCheck?layout=false

在其他一两篇文章中,但我仍然不明白问题出在哪里......

【问题讨论】:

  • 对不起,我的错误我已经编辑了。这是有道理的,我会在测试中检查 NPE。
  • if (title != null && title.length() > 0) 更好,因为它不会为空字符串实例化其他对象。
  • @SashaSalauyou 或 title != null && !title.isEmpty(),假设 Java 1.6+。顺便说一句,像 Klocwork 这样的一些静态分析工具会警告说与空字符串的比较效率不高......
  • @pkalinow isEmpty() 也可以,但是如果你查看源代码,你会发现它也是长度检查。
  • @SashaSalauyou 对,它是一个语法糖:public boolean isEmpty() { return value.length == 0; }

标签: java sonarqube


【解决方案1】:

警告告诉您,不确定title 是否会是null。但是,文字,例如您的空字符串,根据定义永远不能为空。由于equals 可以将null 作为参数处理,因此您可以通过编写<literal>.equals(<somebject>) 来避免潜在的NullPointerException。如果您没有在 if 语句中使用 title,则无需进一步检查空值:

if(!"".equals(title)){
    //rest of loop
}

但是,由于您要检查的东西是否 等于文字,所以让空值通过是没有意义的。

docs也有这个相关说明:

此外,在 equals 之前看到 null 检查是很常见的 不必要的比较 [...]

【讨论】:

  • 在这种情况下,实际上需要进行空检查。 title == null 满足条件!"".equals(title),这在 if 块中是不期望的。
  • @pkalinow 这就是为什么我说 “如果你没有在 if 语句中使用 title ...” :) 在这种情况下,当检查字符串是否为非-empty 当然,允许空值被视为非空似乎很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多