Java 将字段设置为 null 时取消引用 Null - Fortify

Java Null Dereference when setting a field to null - Fortify

当我将字段设置为 null 时,Fortify 抱怨 Null Dereference:

String sortName = null;
if (lastName != null && lastName.length() > 0) {
   sortName = lastName;
}
sortOptions.setSortField(sortName);  <--  Fortify Null Dereference

Fortify 的分析跟踪说:

Assigned null: sortName
Branch taken: if (lastName != null && lastName.length() > 0)
Dereferenced: sortName

我可以试试:

if (sortName == null)
   sortOptions.setSortField(null);
else
   sortOptions.setSortField(sortName);

但这看起来真的很傻。有人有这方面的经验吗?我宁愿摆脱这个发现,也不愿将其注销。

fortify 不喜欢的是你先用 null 初始化变量,没有条件,然后再改变它。

这应该有效:

String sortName;
if (lastName != null && lastName.length() > 0) {
   sortName = lastName;
} else {
   sortName = null;
}
sortOptions.setSortField(sortName);

(如果您愿意,也可以使用三元运算符)

这样你只初始化 sortName 一次,并且明确地表明 null 值在某些情况下是正确的,而不是你忘记了某些情况,导致 var 保持 null 而这是意想不到的。

Null dereference 错误出现在代码行 sortName = lastName; 而不是 setter 的调用:fortify 不希望您有条件地更改未在所有分支中设置为 null 的变量值。

Thierry 的回答很有效。这也通过了 Fortify 的扫描:

Optional<String> sortName = Optional.empty();
if (lastName != null && lastName.length() > 0) {
   sortName = Optional.ofNullable(lastName);
}
sortOptions.setSortField(sortName.orElse(null));