我在下面的行中得到"Possible null pointer dereference due to return value of called method"
FindBugs错误。
Specification spec = Specification.where(idSpec).and(nameSpec)
.and(typeSpec).and(statusSpec);
规范是Spring数据JPA类。它的一些片段:
@Nullable
static <T> Specification<T> where(@Nullable Specification<T> spec) {
return spec == null ? (root, query, builder) -> null : spec;
}
@Nullable
default Specification<T> and(@Nullable Specification<T> other) {
return composed(this, other, (builder, left, rhs) -> builder.and(left, rhs));
}
这是有效的FindBugs错误吗?如何修复?
如何避免对where
和and
的每次调用进行空检查?因此,null检查将降低代码的可读性,而当前读取的代码就像使用方法链接的查询一样。
这是有效的FindBugs错误吗?
是的。
如何修复它?
添加null
的测试或告诉FindBugs保持安静。
如何避免对where和的每次调用进行
null
检查?因此,null检查将降低代码的可读性,而当前读取的代码就像使用方法链接的查询一样。
没有什么灵丹妙药。您需要执行以下操作之一:
- 添加丑陋的null检查,或者
- 为
Specification
编写自己的替换1,其中参数和结果不是Nullable
,或者 - 单独地抑制由FindBugs发现的任何潜在的错误;知道";不是真正的bug,或者
- 完全关掉那张支票
请注意,如果您取消Findbugs检查,这是一个实际的bug,那么您很可能在运行时得到NPE。因此,您有责任使用其他技术来发现应用程序中可能导致NPE的任何(真实(错误。例如,更全面的单元和系统测试。
1-我不确定这在技术上是否可行,但您可能能够编写Specification
和friends的子类,然后更改代码以使用它们而不是原始代码。这样做会有负面影响
Spring已经从Specification
类中删除了这些不正确的@Nullable
注释,作为DATAJPA-1766的一部分。
在使用修复了上述缺陷的Spring版本后,这将很好地工作。