第十九章 Exception(例外)
throw
プログラムの中で意図的に例外をスローします。
目次
1.throwとは
ここまでの例外は、Java仮想マシンが、不正な処理を検出した時にスローしました。
実はプログラムの中でも、意図的に例外をスローさせることができます。
プログラムの中で例外をスローするときに使うのが、throw です。
例外をスローさせるの?
そう。
例外をスローして、
呼び出し元でキャッチしてもらうんだ。
例外をスローする書式
String messsage;
throw new Exception(messsage);
throw の後ろに、Exceptionクラス(又はそのサブクラス)の
インスタンスを記述すると、例外をスローすることができます。
- throw が実行されると、それ以降の処理は中断されます。
- throw を記述したメソッドの呼び出し元が、例外をキャッチすると、
Exceptionクラスのインスタンスが、catch の引数に代入されます。
- 以降は前のページの try-catch の通りです。
2.サンプル
実際に throw を使ってみましょう。
以下のサンプルは、overZeroメソッドで RuntimeException という例外をスローする例です。
//Sample19_25.java
class Sample19_25{
public static void main(String[] args){
try{
//例外がスローされる可能性がある処理
int inputValue = overZero(-1);
System.out.println("The input value is " + inputValue);
}catch(RuntimeException e){
e.printStackTrace();
}
System.out.println("complete");
}
public static int overZero(int value){
// valueが 0より小さい場合に例外をスローするメソッド
if(value<0){
throw new RuntimeException("Value less than 0.");
}
return value;
}
}
コマンドライン
>cd ws
ws>javac -encoding UTF-8 Sample19_25.java
ws>java Sample19_25
java.lang.RuntimeException: Value less than 0.
at Sample19_25.overZero(Sample19_25.java:15)
at Sample19_25.main(Sample19_25.java:5)
complete
overZeroメソッドは、引数の値が 0より小さい場合、
throw によって例外をスローします。
スローされた例外は、mainメソッドの catch で、変数 e に代入されます。
e.printStackTrace(); で表示されているメッセージが、
RuntimeException の引数に与えられた文字列であることに注目してください。
3.throw と return の類似点
ヒントになるかわかりませんが、少し補足します。
throw は、return に少し似ています。
return はメソッドの呼び出し元に値を返しますが、
throw は、例外を返します(スローする)。
throw が実行されると、それ以降の処理は中断されます。
この点も return と同じです。
戻り値があるメソッドの場合、
「処理が上手くできなかったら何の値を返すか」
は、メソッドの設計で重要になります。
戻り値がクラス型の場合、「nullを返す」という選択肢もありますが、
戻り値がプリミティブ型の場合、手段が限られます。
戻り値を返さずに例外をスローする という選択肢は、
結構重要だったりするのです。
お疲れ様でした。