Java代码中counter为null时仍触发异常的忽略需求排查
问题分析与修复方案
嘿,我看你在处理冗余IT系统的校验逻辑时遇到了逻辑不符的问题——你期望当ItSystems为null(也就是counter为null)时不抛出异常,但现有代码的判断逻辑明显和你的需求对不上,咱们一步步来理清楚:
原代码的问题出在哪?
先看你贴的这段代码:
System.out.println(comp.getHardwarekomponente().getItSystems()); Set<ItSystem> counter=comp.getHardwarekomponente().getItSystems(); if (!comp.isVirtualNexusSwitch()) { if (comp.isInheritedRedundant() || comp.isRedundant()) { if(counter != null){ throw new ServiceException(ServiceException.LOGIC_REDUNDANT_ITEMS); } } }
原逻辑是:只要counter不是null,就直接抛出冗余项异常,这完全和你的需求相反啊!你要的是ItSystems为null时忽略,有实际内容的时候才抛异常。另外还要注意:空集合([])和null是两个不同的概念,原代码只判断了null,没处理空集合的情况——如果ItSystems是空集合,原代码也会抛异常,这大概率也不是你想要的。
修复后的代码逻辑
按照你的需求,我们要把判断条件改成:只有当counter不为null,并且里面确实有ItSystem元素时,才抛出异常。修改后的代码如下:
System.out.println(comp.getHardwarekomponente().getItSystems()); Set<ItSystem> counter = comp.getHardwarekomponente().getItSystems(); if (!comp.isVirtualNexusSwitch()) { if (comp.isInheritedRedundant() || comp.isRedundant()) { // 仅当counter存在且包含实际元素时,触发异常 if (counter != null && !counter.isEmpty()) { throw new ServiceException(ServiceException.LOGIC_REDUNDANT_ITEMS); } } }
额外的小优化
如果你的项目里用了Guava或者Apache Commons这类工具库,可以把空判断写得更简洁,还能避免手动判断的疏漏:
- 用Guava的话,直接用
Sets.isEmpty(),它会自动处理null和空集合:if (!Sets.isEmpty(counter)) { throw new ServiceException(ServiceException.LOGIC_REDUNDANT_ITEMS); } - 用Apache Commons Collections的话,用
CollectionUtils.isNotEmpty():if (CollectionUtils.isNotEmpty(counter)) { throw new ServiceException(ServiceException.LOGIC_REDUNDANT_ITEMS); }
这样调整之后,就完全符合你的预期了:
- 当
counter为null时,不会进入异常分支 - 当
counter是空集合时,也不会抛出异常 - 只有当
counter里有实际的IT系统元素时,才触发冗余校验的异常
内容的提问来源于stack exchange,提问作者DATA
相关产品推荐
相关产品推荐

