IllegalStateExceptionについて学びます。
IllegalStateExceptionとは
不正または不適切なときにメソッドが呼び出され時に発生します。(要求された操作に対して適切な状態ではないとき)
不適切な時とはどんなときか簡単な例を挙げてみます。
例えばファイルを開くというopenメソッドがあるとして、すでにファイルが開いている場合、
openメソッドを呼ぶにはすでに開かれているので不適切と判断されます。(必ず閉じていなければメソッドが呼べない場合)
サンプルコード メソッドを呼ぶ適切な状態ではない
不適切な時の例をサンプルコードをみながら理解を深めていきましょう。
import java.util.ArrayList;
import java.util.ListIterator;
public class Main {
public static void main(String[] args) {
//ArrayListをインスタンス化して変数listへ代入
ArrayList<String> list = new ArrayList<String>();
//listへ値を追加
list.add(“apples”);
list.add(“mangoes”);
//listのIteratorを準備
ListIterator<String> it = list.listIterator();
//初めの位置から移動せずにremoveする
it.remove(); //IllegalStateExceptionが発生
}
}
結果
Exception in thread “main” java.lang.IllegalStateException
at java.base/java.util.ArrayList$Itr.remove(ArrayList.java:976)
at Main.main(Main.java:13)
ListIteratorのremove()メソッドはnext()またはprevious()によって返された最後の要素をリストから削除することが可能なメソッドです。
そのためnext()もprevious()もしていない状態でremove()を呼び出していることからIllegalStateExceptionが発生しました。
サンプルコード throwで
throwで発生させている例文を紹介いたします。
public class IllStaTest {
private boolean initted;
public void initialise() {
// some code
initted = true;
}
public void print() {
if (!initted){
throw new IllegalStateException(“オブジェクトは初期化されていません。”);
}else{
System.out.ptintln(“初期化済のため処理を実行”);
// some code
}
}
}
public class Main {
public static void main(String[] args) {
IllStaTest obj = new IllStaTest();
obj.print();
}
}
結果
Exception in thread “main” java.lang.IllegalStateException: オブジェクトは初期化されていません。
at IllStaTest.print(IllStaTest.java:10)
at Main.main(Main.java:5)
初期化が行われていないと動かないようなメソッドがあるとして、初期化がきちんと行われているか確認するためにフラグを設定して確認しています。
初期化が行われていなければメソッドは呼び出せない状態であるためIllegalStateExceptionとなります。
おわり
機能をきちんと把握していないAPIを使用するときに多く見かけそうですね。
illegalargumentexceptionとも似ていてthrowを書く時にどちらに設定すべきか悩みそうですが、stateは状況・状態を表す意味であり、単純に引数の不正ではなくメソッドを呼ぶべき状態でないと判断しなければいけません。
参考
https://www.javamex.com/tutorials/exceptions/exceptions_throwing.shtml
https://www.tutorialspoint.com/when-do-illegalstateexception-and-illegalargumentexception-get-thrown-in-java