例外定義
ユーザー定義例外とthrows
Javaには、そのアプリケーションやクラスの特有の問題解決のため
ユーザーが独自の例外を定義することができます
ユーザー定義例外はExceptionクラスを拡張しなければいけません
Exceptionクラスを拡張した独自の例外クラスを作成し
それをthrowで明示的に例外を発生させます
しかし、それだけではできません
Javaの例外で、もうひとつ知っておかなければならないことがあります
利用するメソッドが投げる可能性のある例外、もしくは受け取る可能性のある例外を明示しなければいけません
なぜならば、あるクラスのメソッドを利用するのに
プログラマはそのメソッドが返す可能性のある例外の情報を知る必要があります
当然、メソッドの製作者もそのメソッドがどのような例外を返すかという情報を与えなければいけません
これまで、そのようなことをせずに例外をキャッチできたのには理由があります
JavaではRuntimeExceptionかError以外のクラスは、その例外が返されることを宣言しなければならないのです
いままで使ってきたArithmeticExceptionなどはRuntimeExceptionのサブクラスだからそのまま使えたのです
これで、例外が返ってくるという警告をすることができ
メソッドを利用するプログラマは、その場で例外をキャッチするかスタックの上へ返すかなどを選択できます
投げられる可能性のある例外の宣言は、メソッド、またはコンストラクタでthrowsをシグネチャとして宣言します
(しかし、メソッドが投げる例外自体はシグネチャの一部ではない)
type method throws e1 , e2 , en... {
e1などに例外の名前を指定します
とうぜんThrowableに代入できる型でなくてはなりません
throwsは、独自の例外以外にもRutimeException以外の例外クラスの使用でも使います
(たとえば、ClassNotFoundExceptionなど)
もちろんユーザー定義クラスがRuntimeExceptionのサブクラスであれば、throwsを使う必要はありません
class Test {
public static void main(String args[]) {
try {
ThrowException();
}
catch (Exception err) {
System.out.println(err);
}
}
static void ThrowException() throws MyException {
throw new MyException("ThrowException() の例外");
}
}
class MyException extends Exception {
public MyException(String msg) { super(msg); }
}
MyException クラスが、Exception クラスのサブクラスとなっています
Test クラスの ThrowException() メソッドは MyException が発生する可能性を throws で報告しています
もし throws がなければ、MyException を投げることはできません
ThrowException( ) メソッドの throws を消してコンパイルしてみてください
結果は次のようになりました
メソッドが報告している例外に興味がない場合でも例外を処理しなければなりません
そうでなければ、そのメソッドの呼び出し元に例外を投げる必要があります
throws を報告しているメソッドの例外を処理しないのであれば
そのメソッドも同様に throws で投げられた例外を報告しなければなりません
class Test {
public static void main(String args[]) throws MyException {
ThrowException();
}
static void ThrowException() throws MyException {
throw new MyException("ThrowException() の例外");
}
}
class MyException extends Exception {
public MyException(String msg) { super(msg); }
}
先ほどは main() メソッド内で例外を catch していたので throws する必要はありませんでした
しかし、今回は例外を catch しないため、main()メソッドも throws を報告しなければならないのです
まとめると、メソッドが処理中に例外を発生させる可能性があり
その例外が RutimeException、または Error 型ではない場合は
メソッドの宣言時に throws で投げる例外の型を報告しなければならず
throws で例外の可能性を報告しているメソッドを呼び出すブロックは
その例外をキャッチするか、throws で報告しなければならいということです
このことは例外において重要なことです。おさえておきましょう
throws
メソッドの宣言で使用します
メソッドがスローする可能性のある例外を指定します
ただし、RuntimeExceptionやError、またはそのサブクラスの場合は必要ありません