throw - Exception(例外) - 萌えJava超入門
第十九章 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;
    }
}

ヒント:
RuntimeException は非チェック例外のため、
overZeroメソッドに throws の記述をしていません。(後述)
mainメソッドの try-catch がなくてもコンパイルはできます。


コマンドライン
>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を返す」という選択肢もありますが、
戻り値がプリミティブ型の場合、手段が限られます。
戻り値を返さずに例外をスローする という選択肢は、
結構重要だったりするのです。




お疲れ様でした。




© 2019 awasekagami