例外

例外型の作成

すべての例外型は、Throwableクラスまたはそのサブクラスを継承して作成します。Throwable (Java Platform SE 7 )

例外のスロー

例外は、throw文によってスローできます。

throw expression;

例外の捕捉

tryブロック内でスローされた例外は、catch節で捕捉できます。

try {
    statements
} catch (exception_type1 e) {
    statements
}
} catch (exception_type2 e) {
    statements
} finally {
    statements
}
14.20. The try statement - Chapter 14. Blocks and Statements

catch節は記述された順に処理されます。そのため、ある例外型AのサブクラスBが後に記述されていると、例外型Bのcatch節は機能しなくなります。なお、このような場合には「Unreachable catch block for B_Exception. It is already handled by the catch block for A_Exception」のようにエラーとして通知されます。

Exception型の捕捉

Exceptionはすべての例外のスーパークラスです。よって、

catch (Exception e) {}

のようにすると、あらゆる例外型が捕捉されてしまいます。

スローする例外の宣言 (throws)

throws節では、メソッドでスローする例外を宣言します。これはチェックされる例外 (checked exception) と呼ばれ、メソッドはここで宣言した例外しかスローできません。(RuntimeExceptionとErrorだけは特別で、これらはthrowsで宣言する必要がありません。)

public void Foo() throws Exception {
    //
}

throwsが宣言されたメソッドを、呼び出す側の処理

throwsが宣言されたメソッドを呼び出す側は、その例外に対処することを強制されます。何も対処をしないと、コンパイラによってエラーとなります。

void Foo() throws Exception{
    //
}

void Bar() {
    Foo(); // NG : Unhandled exception type Exception
}

これに対処するには、次のようにtry...catchで例外を捕捉するか、

void Bar() {
    try {
        Foo();
    } catch (Exception e) {
        // 例外に対する処理
    }
}

呼び出す側のメソッドにもthrowsを宣言し、例外を通過させます。

void Bar() throws Exception {
    Foo();
}

参考

参考書

Javaのドキュメントから検索