Java言語の例外(Exception)とカスタム例外の定義方法

2009/10/21 11:09Update
TAGS: Java | Exception | Throwable | RuntimeException | 例外 | 異常

Java言語では、例外という仕組みが提供されています。例外とは、プログラム動作における予期せぬのエラーのことです。例外が発生すると、プログラムは従来通りのルートでの実行ができなくなり、強制終了します。
本文はJava例外の概要や処理原則、カスタム例外の定義方法などについて解説します。

例外発生するシーン


1)入力エラー・不正による例外
2)IOエラー(ファイルやネットワークなど)による例外
3)DBアクセスエラーによる例外
4)・・・

例外の処理


例外を放置すると、プログラムが暴走したり、予期せぬ結果を招く可能性があります。

例外は大きく分けて2つがあります。
1)予想内、処理(catch)できる例外:例えば、ユーザ入力エラーの場合にあった例外。
  この種類の例外だと、プログラムの中にcatchして、処理すべきです。
try {
   ... //プログラム
} catch (SomeException ex) {//想定内の例外をcatchし処理する
   ...
}
2)予想外、処理(catch)できない例外/またはcatchしても何をしてはよいかを分からない例外:例えば、実行中にLANケーブルを抜けてネットワークにアクセス不能による例外、システム不具合による例外など。
  この種類の例外だと、まず原因を掴んで、不具合を改修すべきです。なるべくこの種類の例外をなくすべきです。

例外のthrow


例外はプログラムのメソッドより投げ出されます。
public void testThrowException() throws IOException {//throws声明
    ...
    throw new IOException(...);
}

例外のcatch


■例外処理の原則
1.自分で処理できない例外はcatchしない。
2.catchした例外に対する処理は必ず行う。
3.例外はなるべく発生源に近いところでcatchする。

try {
    ...   //処理
} 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();
    //その他処理ここ
}

ほぼ同じですね。使い方によって適当に使い分ければいいでしょう。

有关作者
Syboos.jp編集長システム設計や開発、保守運営などを行ってます。オープンソース技術に興味があります。

Sponsored Link


Comments