【问题标题】:IntelliJ Java inspection non primitive Boolean in 'if' statements“if”语句中的 IntelliJ Java 检查非原始布尔值
【发布时间】:2021-11-08 13:57:52
【问题描述】:

我希望在我的 Java 代码中收到警告,其中“if”语句基于非原始布尔条件。

例如:

void anyMethod() {
   if(getCondition()) {
   ...
   }
}

Boolean getCondition() {
...
}

getCondition() 可能返回 TRUE、FALSE 或 null

这种“if”控件可能会产生 NullPointerException,应该避免。

在 IntelliJ 中,我尝试创建自定义检查模式,但我的不起作用。 如果我在 getCondition() 上明确放置 @Nullable 注释,则默认检查工作,但此解决方案仍然依赖于可能未严格完成的手动任务(将 @Nullable 放置在方法返回布尔值的任何地方)并且不涵盖代码条件是一个局部布尔变量。

如何编写 IntelliJ 检查模式来跟踪此案例?

非常感谢。

【问题讨论】:

  • getCondition 首先返回一个装箱的布尔值的原因是什么?
  • getCondition() 在需要的数据不可用时可能会返回 null。当它是具有可选属性的类的一部分时,它可能会发生。
  • 我认为这是一个糟糕的设计。如果数据不存在,则条件可能应该默认(真或假,这是你最清楚的)。或者,如果某些东西确实应该存在但不存在,那么应该抛出异常。但是我不会依赖一个装箱的布尔值,当找到 null 时,你希望函数的调用者做什么是你首先应该在函数方面做什么。
  • 如果“可选属性”是这里的用例,我宁愿使用Optional<Boolean> 而不是Boolean 可能是null
  • 感谢您的回复。我知道代码可能会更好(@MC Emperor 提出的可能是正确的方法),但我的意思不是挑战编写返回布尔值的方法的可能性,而是找到一种方法来跟踪 '在 'if' 语句中使用布尔值的不良做法发生在现有代码中。

标签: java intellij-idea


【解决方案1】:

您可以像这样为此创建自定义检查:

首先转到 IntelliJ 设置页面中的检查选项卡。然后点击加号按钮,然后点击“添加搜索模板”

然后使用模式:

if ($expression$) {$statement$;}

将过滤器“type=java.lang.Boolean”添加到$expression$ 模板,并将“count=[0,inf]”添加到$statement$ 模板。添加过滤器时记得将光标放在模板上。

最终结果应该是这样的:

为检查命名、工具提示、描述和抑制 ID,您就完成了。

【讨论】:

  • 非常感谢@Sweeper,您的回答完全符合我的预期!它就像一个魅力,将帮助我跟踪更多代码的缺陷;-)
猜你喜欢
  • 2019-06-30
  • 1970-01-01
  • 2013-03-01
  • 2015-05-25
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
相关资源
最近更新 更多