050-例外処理-throwとthrows 【新人エンジニアが最初に覚えたい100のJava文法】

ユーチューブ動画

throwとthrowsについて解説します。

ソースコード

class UserDefException extends Exception {
	public UserDefException(String message) {
		super(message);
	}
}
class ExceptionThrowTest {
	public void method() throws UserDefException {
		try{
			String[] args = { "a", "b", "c" };
			String data = args[3];
			System.out.println(data);
		}catch(ArrayIndexOutOfBoundsException e){
			throw new UserDefException("Error");
		}
	}
}
public class ExceptionTest {
	public static void main(String[] args) {
		try{
			new ExceptionThrowTest().method();
		}catch(UserDefException e){
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
	}
}

解説

throwとthrowsについて解説します。

似たようなキーワードなので、先にポイントを解説しておきましょう。

まずthrowはメソッドの処理中に記述するキーワードです。

例外を任意の位置で発生させることができます。

次にthrowsですが、こちらはメソッドの定義に使用するキーワードです。

throwsについた例外は、自分のメソッド中で処理しなくてもよいことになっています。

なぜ、このようなキーワードで処理するかというと、業務でJavaを扱う場合には、

一つのクラスで運用することは少なく、複数のクラスで運用するからです。

throwキーワードを使うと、コードの途中でわざと例外を発生させることができます。

「SQLException」や「ClassNotFoundException」などの例外が発生した場合、try-catchの構文では、その場所で処理しなければいけません。

たとえば、データベースでエラーが発生したときに、一般のユーザーにSQLExceptionが発生しましたといっても理解できないですよね?

そこでcatchブロックにおいて、独自の例外をわざとスローし、例外を置き換えます。

例えば、データベースで何らかのエラーが発生した場合、その例外処理を集約して画面系のモジュールで処理し、エラー画面にジャンプさせるような流れを作る場合があります。

このように例外を伝えるためにthrowとthrowsが必要になります。

サンプルコードでは、疑似体験ができます。

ExceptionTestが画面系のクラスだと考えてください。

実際には、ExceptionThrowTestクラスの中で、

配列外にアクセスしたときに発生するArrayIndexOutOfBoundsExceptionの例外になりますが、ここでは具体的な例外処理を行いません。

独自に作成したUserDefExceptionをスローして、その例外が発生したときにはthrowsキーワードで呼び出し元に例外処理をさせるようにします。

これにより、呼び出し元のExceptionTestで例外処理を行います。

よく勘違いされるのですが、例外が無くなるわけではありません

あくまでもthrowsキーワードで例外する場所を移動させているのです。

最終的には、ExceptionTestでtry-catch構文を使って、独自の例外クラスの処理を行います。

以前の動画を見た方、独自の例外クラスのコンストラクタに注目していると思います。

Super(〜)でセットしたメッセージは、こちらのe.getMessageで取り出すことができます。

結果は「Error」と表示されます。その次に、printStackTraceの出力が表示されます。

独自の例外クラスのコンストラクタに代入した値がgetMessageで取り出されます。

いかがでしたか?throwとthrowsを使って、例外処理の場所を移動させていることがチェックできたでしょうか?

以上、throwとthrowsについて解説しました。

このサンプルコードをJavaタッチタイプゲームとして遊ぶことができます。