Cara menyelesaikan Java IteratorException (IteratorException)
Dalam pengaturcaraan Java, iterator (Iterator) ialah struktur data yang biasa digunakan untuk melintasi elemen dalam koleksi atau senarai. Walau bagaimanapun, jika anda menggunakan iterator secara salah, pengecualian iterator (IteratorException) mungkin dilemparkan, menyebabkan ralat program.
Artikel ini akan memperkenalkan punca biasa pengecualian iterator dan cara menggunakan iterator dengan betul untuk mengelakkan pengecualian.
Sebab 1: Pengubahsuaian serentak
Sebuah iterator direka untuk melintasi elemen dalam koleksi atau senarai Semasa proses traversal, ia perlu memperoleh kunci pada struktur data dalaman untuk memastikan ketepatan traversal. Oleh itu, apabila utas lain mengubah suai koleksi atau senarai semasa proses traversal iterator, pengecualian pengubahsuaian serentak (ConcurrentModificationException) akan berlaku.
Kod contoh:
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); // 在遍历过程中删除元素 } }
Penyelesaian:
Semasa proses traversal iterator, jangan gunakan kaedah pengubahsuaian set atau senarai (seperti remove) untuk mengubah suai data, tetapi gunakan kaedah alih keluar iterator.
Kod sampel yang diubah suai:
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方法来删除元素 } }
Sebab dua: Status lelaran yang salah
Iterators mempunyai tiga keadaan: tersedia (hasNext), diperoleh (seterusnya) dan dipadamkan (alih keluar). Apabila menggunakan iterator dengan betul, anda perlu memanggil kaedah ini dalam susunan yang betul. Jika tidak, pengecualian iterator akan dilemparkan.
Kod contoh:
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); }
Penyelesaian:
Gunakan urutan kaedah iterator dengan betul: mula-mula panggil kaedah hasNext, kemudian panggil kaedah seterusnya, dan akhirnya panggil kaedah alih keluar.
Kod contoh yang diubah suai:
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); }
Ringkasan:
Penggunaan iterator yang betul adalah kunci untuk mengelakkan pengecualian iterator. Semasa proses traversal, jangan ubah suai koleksi atau senarai, tetapi gunakan kaedah alih keluar iterator untuk memadamkan elemen. Pada masa yang sama, ia juga sangat penting untuk memanggil kaedah iterator (hasNext, next, remove) dalam susunan yang betul.
Dengan mengikut prinsip di atas, kita boleh mengelakkan berlakunya pengecualian iterator dan menjadikan program lebih mantap dan boleh dipercayai.
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan pengecualian iterator Java (IteratorException). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!