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 分析。