JD.NEXT
当调用没有前缀 hasNext() 的 Iterator.next() 时,发生 JD.NEXT。
漏洞与风险
如果集合中的元素不足,“next()”方法就会引发 NoSuchElement 异常。
缓解与预防
如果预计有异常,将方法标记为引发 java.util.NoSuchElementException。否则,最好为 iter.hasNext 而非 collection.size() 添加显式检查,避免在时间上出现检查和使用争用情况。即使您认为该方法不是多线程方法,它也能提高代码的可读性和可维护性。
示例 1
复制
public boolean intersects(Set setA, Set setB) {
for (final Iterator iteratorA = setA.iterator(); iteratorA.hasNext();) {
final Object a = iteratorA.next();
for (final Iterator iteratorB = setB.iterator(); iteratorB.hasNext();) {
Object b = iteratorA.next();
if (a.equals(b)) {
return true;
}
}
}
return false;
}
针对第 15 行的代码段报告 JD.NEXT:为 iteratorA 调用的方法 next() 没有前置 hasNext() 检查。您可能准备为“iteratorB”而非“iteratorA”调用“next()”方法。
示例 2
复制
public boolean intersects(Set setA, Set setB) {
for (final Iterator iteratorA = setA.iterator(); iteratorA.hasNext();) {
final Object a = iteratorA.next();
for (final Iterator iteratorB = setB.iterator(); iteratorB.hasNext();) {
Object b = iteratorB.next();
if (a.equals(b)) {
return true;
}
}
}
return false;
}
上一节中的代码段已修复;对于“next”的所有调用前面都添加了相应的“hasNext”检查。此处未报告 JD.NEXT。
扩展
此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 Java 分析。