JavaでIllegalStateExceptionがスローされるのはいつ?チェックされない例外の発生条件を解説
IllegalStateExceptionは、Javaにおける非チェック例外(unchecked exception)の一つです。この例外は、主にjava.utilパッケージのコレクションフレームワークを扱う際に発生しやすくなります。List、Queue、Tree、Mapなどさまざまなコレクションがありますが、その中でも特にListとQueue(QueueおよびDeque)は、特定の条件下でこのIllegalStateExceptionをスローすることがあります。
IllegalStateExceptionがスローされる主なケース
- あるメソッドを不適切なタイミングで呼び出そうとした場合に、この例外がスローされます。
- java.util.Listコレクションでは、ListIteratorインターフェースのnext()メソッドを使ってリストを走査します。もしnext()を呼び出す前にremove()メソッドを呼び出すと、リストが不安定な状態になってしまうため、この例外がスローされます。
- 特定の要素を変更したい場合は、ListIteratorインターフェースのset()メソッドを使用します。
- Queueの場合、要素を追加する際にはキューが満杯でないことを確認する必要があります。満杯のキューに要素を追加しようとすると、IllegalStateExceptionがスローされます。
コード例
import java.util.*;
public class IllegalStateExceptionTest {
public static void main(String args[]) {
List list = new LinkedList();
list.add("Welcome");
list.add("to");
list.add("Tutorials");
list.add("Point");
ListIterator lIterator = list.listIterator();
lIterator.next();
lIterator.remove(); // リストの変更
lIterator.set("Tutorix");
System.out.println(list);
}
}
実行結果
Exception in thread "main" java.lang.IllegalStateException
at java.util.LinkedList$ListItr.set(LinkedList.java:937)
at IllegalStateExceptionTest.main(IllegalStateExceptionTest.java:15)
なぜ例外が発生するのか?
上記のコードでは、next()を1回呼び出した直後にremove()を実行しています。remove()やadd()を呼び出すとイテレータの内部状態がリセットされるため、その後再びnext()またはprevious()を呼び出さずにset()を実行すると、IllegalStateExceptionがスローされます。この例外を回避するには、set()を呼び出す前に再度next()を呼び出してイテレータを正しい状態に戻す必要があります。
-
JavaでArrayListをループ処理する5つの方法を徹底解説
このチュートリアルでは、JavaでArrayListを反復処理(イテレーション)する5つの異なる方法を紹介します。Java 8以降では、forEachメソッドやIteratorクラスを使ってArrayListをループ処理することも可能です。 ArrayListをループ処理する主な方法 ArrayListをループ処理する方法は、主に以下の5つがあります。 従来のfor文(クラシックForループ) 拡張for文 Iterator(イテレータ) while文 forEachメソッド(Java 8) まずは、各ループの例で使用するArrayListを作成しましょう。 import java.uti
-
JavaでList(リスト)を配列に変換する方法|toArray()とArrays.asList()の使い方
Javaの開発において、List(リスト)と配列(Array)の相互変換は非常によく使われる基本的な操作です。 Listを配列に変換する最も簡単かつ推奨される方法は、.toArray()メソッドを使うことです。逆に、配列をListに戻したい場合は、Arrays.asList()メソッドを使用します。 以下では、文字列(String)のListや整数(Integer)のListを、それぞれ対応する配列に変換する具体例を紹介します。 String型のListを配列に変換する import java.util.ArrayList; import java.util.List; public cl