IllegalStateExceptionとは?
IllegalStateException は、オブジェクトの状態がメソッドの呼び出しに適していない場合に発生する例外です。主に「オブジェクトが期待される状態になっていないのに操作を試みた」ケースでスローされます。
原因
IllegalStateException が実装されているコードの例です。
以下のように、状態をチェックした時に想定した状態になっていないとスローされるようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.sun.jmx.snmp.tasks; public class ThreadService implements TaskServer { ... private void stateCheck() throws IllegalStateException { if (terminated) { throw new IllegalStateException("The thread service has been terminated."); } } |
IllegalStateException は実行時例外なので、アプリケーション実行時に起こります。検査例外ではないのでコンパイルでは気づけません。
解消方法
不正な状態での操作をやめるしかありません。
手順:
- 発生時の状態がどのようになっていたかを調査する。
- 例外が発生した箇所をスタックトレースで特定する。
- ログが出ていれば調査は簡単だが、出てなければログを追加する。
- 実装を修正する。
- 不正な状態にならないようにプロダクトコードを修正する。
- テストをコードを書いて例外が発生しないことを確認する。
IllegalStateExceptionの使い方
独自のクラスを作って、その中でIllegalStateExceptionを発生させたいときは以下のようにします。
使い方の例:
1. 例外をスローするクラス
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class MyClass { private boolean state; public MyClass() { this.state = false; } public boolean isState() { return state; } public void setState(boolean state) { this.state = state; } public void doAction() { if (!state) { throw new IllegalStateException("不正な状態です。state: " + state); } // 任意の実装 } } |
2. 呼び出すクラス
1 2 3 4 5 6 7 8 |
public class Main { public static void main(String[] args) { MyClass myClass = new MyClass(); myClass.doAction(); } } |
3. 実行結果
Exception in thread "main" java.lang.IllegalStateException: 不正な状態です。state: false
at org.exception.MyClass.doAction(MyClass.java:20)
at org.exception.Main.main(Main.java:6)
例外を実装する場合、必ずエラーメッセージを出力するようにしてください。
また、エラーメッセージにはエラーの特定や解決につながる情報を含めるようにしてください。
まとめ
- IllegalStateExceptionは不正な操作が行われた際にスローされる例外である。
- 原因の調査ができるようにログ出力されるようにしておくことが望ましい。
- 独自に例外を実装する場合は、必ずエラーメッセージを出力すること。
スキルアップ
例外はJava Silver で取り扱っています。
処理方法をしっかり理解して、資格の取得にも挑戦してみて下さい。
コメント