JD.NEXT
JD.NEXT は、hasNext() が先行せずに Iterator.next() が呼び出される場合に発生します。
脆弱性とリスク
コレクションに十分な要素が存在しない場合、'next()' メソッドは NoSuchElement 例外をスローする可能性があります。
軽減と防止
例外が予想される場合には、java.util.NoSuchElementException をスローするものとしてメソッドをマーキングしてください。また、collection.size() の代わりに iter.hasNext の明示的なチェックを追加して、チェック時から使用時までの競合状態を回避するのも良い方法です。このメソッドがマルチスレッドでない場合であっても、コードの判読性と保守性が向上します。
例 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;
}
JD.NEXT が 15 行目のスニペットに対して報告されています。 'hasNext()' チェックが先行せずに 'next()' メソッドが 'iteratorA' に対して呼び出されています。'iteratorA' ではなく 'iteratorB' に対して '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 knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。