Java言語の例外(Exception)とカスタム例外の定義方法
2009/10/21 11:09Update
Java言語では、例外という仕組みが提供されています。例外とは、プログラム動作における予期せぬのエラーのことです。例外が発生すると、プログラムは従来通りのルートでの実行ができなくなり、強制終了します。
本文はJava例外の概要や処理原則、カスタム例外の定義方法などについて解説します。
例外発生するシーン
1)入力エラー・不正による例外
2)IOエラー(ファイルやネットワークなど)による例外
3)DBアクセスエラーによる例外
4)・・・
例外の処理
例外を放置すると、プログラムが暴走したり、予期せぬ結果を招く可能性があります。
例外は大きく分けて2つがあります。
1)予想内、処理(catch)できる例外:例えば、ユーザ入力エラーの場合にあった例外。
この種類の例外だと、プログラムの中にcatchして、処理すべきです。
try {
... //プログラム
} catch (SomeException ex) {//想定内の例外をcatchし処理する
...
}
2)予想外、処理(catch)できない例外/またはcatchしても何をしてはよいかを分からない例外:例えば、実行中にLANケーブルを抜けてネットワークにアクセス不能による例外、システム不具合による例外など。... //プログラム
} catch (SomeException ex) {//想定内の例外をcatchし処理する
...
}
この種類の例外だと、まず原因を掴んで、不具合を改修すべきです。なるべくこの種類の例外をなくすべきです。
例外のthrow
例外はプログラムのメソッドより投げ出されます。
public void testThrowException() throws IOException {//throws声明
...
throw new IOException(...);
}
...
throw new IOException(...);
}
例外のcatch
■例外処理の原則
1.自分で処理できない例外はcatchしない。
2.catchした例外に対する処理は必ず行う。
3.例外はなるべく発生源に近いところでcatchする。
try {
... //処理
} catch (IOException ioex) {
... //IOException時の処理
} catch (MyException mex) {
... //MyException 時の処理
}
... //処理
} catch (IOException ioex) {
... //IOException時の処理
} catch (MyException mex) {
... //MyException 時の処理
}
カスタム例外の定義
■■明示的に処理しなければならないExceptionの定義方法
1)java.lang.Throwableクラスを継承したクラスを定義
例:
public class MyException extends Throwable {...}
2)より上レベルのjava.io.Exceptionを継承したクラスを定義
例:
public class MyException extends Exception {...}
例えば、
MyException.java
import java.io.IOException;
public class MyException extends Exception {
/**
* デフォルト・コンストラクタ
*/
public AppException() {
super();
}
/**
* メッセージ付け異常を構築する
* @param message エラーメッセージ
*/
public AppException(String message) {
super(message);
}
/**
* メッセージ付け、異常の発生元(throwable)情報を持つ異常を構築する
* @param message
* @param throwable
*/
public AppException(String message, Throwable throwable) {
super(message, throwable);
autoMatchExceptionType(throwable);
}
/**
* 異常を発生する元(throwable)情報を持つ異常を構築する
* @param throwable
* Throwable
*/
public AppException(Throwable throwable) {
super(throwable);
autoMatchExceptionType(throwable);
}
//その以外の定義はここに
}
■throwの使用例:
public void testThrowException() throws MyException {//メソッドに明示的なthrows声明が必要
...
boolean validInput = ...;
if (!validInput) {
throw new MyException();
}
}
■throwしたExceptionの処理例:
try {
} catch (MyException mex) {//MyException例外をキャッチ
mex.printStackTrace();
//その他処理ここ
} catch (Exception ex) {//その以外の例外をキャッチ
ex.printStackTrace();
//その他処理ここ
}
■■明示的に処理する必要のないExceptionの定義方法
3)java.lang.RuntimeExceptionクラスを継承したクラスを定義
public class MyException extends RuntimeException { ... }
定義方法の詳細について、上の例をご参照ください。
■RuntimeExceptionを継承したカスタム例外の使用方法:
public void testThrowException() {//メソッドに明示的なthrows声明する必要がない
...
boolean validInput = ...;
if (!validInput) {
throw new MyException();
}
}
■throwしたExceptionの処理例:
try {
} catch (MyException mex) {//MyException例外をキャッチ
mex.printStackTrace();
//その他処理ここ
} catch (Exception ex) {//その以外の例外をキャッチ
ex.printStackTrace();
//その他処理ここ
}
ほぼ同じですね。使い方によって適当に使い分ければいいでしょう。
Sponsored Link
- Relative Articles
- Java開発及び実行環境の構築 | Linux篇 - (2008/08/31 20:34)
- Java開発及び実行環境の構築 | Windows篇 - (2008/08/31 21:18)
- 5分でJava Hello World! - (2008/08/31 22:13)
- Java言語の制御構文 - 条件分岐if/else/else if - (2008/10/01 21:30)
- Java言語の繰り返し制御構文 - for文 - (2008/10/03 18:22)
- Java言語の繰り返し制御構文 - do ... while文 - (2008/10/03 21:23)
- Java言語の繰り返し制御構文 - while文 - (2008/10/03 21:32)
- Java言語の基礎 - javacコマンドによるコンパイル - (2008/10/10 17:58)
- Java アクセス修飾子概要 - (2008/10/29 18:31)
- Javaアノテーション機能 概要 - (2009/02/12 13:06)