SpotBugs中DMI_DOH误报咨询:静态字段调用isNullOrEmpty触发警告
为什么静态注入字段会触发SpotBugs的DMI_DOH警告?
先明确DMI_DOH警告的核心:SpotBugs抛出这个警告,是因为它判定你调用com.google.common.base.Strings.isNullOrEmpty的参数,是确定不会为null或空的字符串,所以这个调用完全多余,属于“无意义操作”。
回到你的场景,问题出在静态字段+@Injected注解的组合上:
- SpotBugs的静态分析能力有限,它识别不了你用的CLI库对静态字段的运行时注入逻辑。对于静态字段,它默认会假设:要么在类加载阶段被显式赋值,要么由依赖注入框架注入必填的非空值——而@Injected注解让它进一步强化了这个错误假设,认为这个静态filename字段一定会被赋值为非null且非空的字符串。
- 基于这个假设,SpotBugs就会觉得你调用
isNullOrEmpty是多此一举,直接抛出DMI_DOH警告。
而当你把static修饰符去掉后,字段变成实例字段:
- SpotBugs知道实例字段的赋值时机更灵活(比如对象构造后才会被注入),不会默认认为它的值是固定的非空值,自然就不会触发这个误报。
如果想保留static修饰符同时消除警告,可以试试给这个filename字段加上@Nullable注解(比如JSR305的javax.annotation.Nullable),明确告诉SpotBugs这个字段可能为null,就能修正它的静态分析判断。
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

