CodeQL 文档

装箱变量永远不为空

ID: java/non-null-boxed-variable
Kind: problem
Security severity: 
Severity: warning
Precision: very-high
Tags:
   - readability
   - types
Query suites:
   - java-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

在 Java 中,所有基本类型都有对应的装箱类型。装箱类型是对象,因此可以为 null,而基本类型永远不能为 null。基本类型和装箱类型的名称相似,只是基本类型以小写字母开头,而装箱类型以大写字母开头(此外,对于 charint,装箱类型的名称稍长,即 CharacterInteger)。

因为名称非常相似,并且 Java 执行自动装箱和拆箱转换,所以它们很容易混淆。此外,在应该使用基本类型的地方使用装箱类型会导致可读性问题,并可能导致不必要的对象分配。

建议

如果一个变量永远不会被赋值为 null,则它应该使用基本类型,因为这既可以直接表明不可能为 null,也可以避免不必要的装箱和拆箱转换。

示例

在下面的示例中,变量 done 控制循环退出。它只在循环进入之前设置为 false,并在循环迭代期间的某个时刻设置为 true

Boolean done = false;
while (!done) {
  // ...
  done = true;
  // ...
}

每次对 done 的赋值都涉及到一个装箱转换,而检查则涉及到一个拆箱转换。由于 done 永远不会是 null,因此可以通过使用基本类型来完全避免这些转换,并使代码更清晰。因此,代码应该按以下方式重写

boolean done = false;
while (!done) {
  // ...
  done = true;
  // ...
}

参考文献

  • ©GitHub 公司
  • 条款
  • 隐私