Javaイテレータ例外(IteratorException)の解決方法

WBOY
リリース: 2023-08-17 22:43:45
オリジナル
1642 人が閲覧しました

Javaイテレータ例外(IteratorException)の解決方法

Java イテレータ例外 (IteratorException) を解決する方法

Java プログラミングでは、イテレータ (Iterator) は、リスト内のコレクションまたは要素を走査するために使用される一般的に使用されるデータ構造です。 。ただし、イテレータを誤って使用すると、イテレータ例外 (IteratorException) がスローされ、プログラム エラーが発生する可能性があります。

この記事では、イテレータ例外の一般的な原因と、イテレータを正しく使用して例外を回避する方法を紹介します。

理由 1: 同時変更

反復子は、コレクションまたはリスト内の要素を走査するように設計されています。走査プロセス中に、内部データ構造のロックを取得して、トラバースの正確さ。したがって、反復子の走査プロセス中に他のスレッドがコレクションまたはリストを変更すると、同時変更例外 (ConcurrentModificationException) が発生します。

サンプル コード:

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String item = iterator.next();
    if (item.equals("a")) {
        list.remove(item); // 在遍历过程中删除元素
    }
}
ログイン後にコピー

解決策:

反復子の走査プロセス中に、セットまたはリストの変更メソッド (削除など) を使用してデータを変更しないでください。イテレータのremoveメソッドを使用します。

修正されたサンプル コード:

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");

Iterator<String> iterator = list.iterator();

while (iterator.hasNext()) {
    String item = iterator.next();
    if (item.equals("a")) {
        iterator.remove(); // 使用迭代器的remove方法来删除元素
    }
}
ログイン後にコピー

原因 2: イテレータ ステータス エラー

イテレータには、利用可能 (hasNext)、取得 (次)、および削除 (削除) の 3 つの状態があります。イテレータを正しく使用する場合は、これらのメソッドを正しい順序で呼び出す必要があります。それ以外の場合は、イテレータ例外がスローされます。

サンプル コード:

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");

Iterator<String> iterator = list.iterator();

while (iterator.hasNext()) {
    iterator.remove(); // 错误的调用了remove方法,应该在调用next后再调用remove
    String item = iterator.next();
    System.out.println(item);
}
ログイン後にコピー

解決策:

イテレータを使用する正しい順序: 最初に hasNext メソッドを呼び出し、次に next メソッドを呼び出し、最後に Remove メソッドを呼び出します。

修正されたサンプル コード:

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");

Iterator<String> iterator = list.iterator();

while (iterator.hasNext()) {
    String item = iterator.next();
    iterator.remove(); // 先调用next再调用remove
    System.out.println(item);
}
ログイン後にコピー

概要:

イテレータを正しく使用することが、イテレータ例外を回避するための鍵です。走査プロセス中は、コレクションまたはリストを変更せず、代わりにイテレータの Remove メソッドを使用して要素を削除します。同時に、反復子メソッド (hasNext、next、remove) を正しい順序で呼び出すことも非常に重要です。

上記の原則に従うことで、反復子例外の発生を回避し、プログラムの堅牢性と信頼性を高めることができます。

以上がJavaイテレータ例外(IteratorException)の解決方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート