Javaの例外処理におけるthrowとthrowsの違い

例外処理はあまり触る機会が無く、throwとthrowsの違いを知らなかったのでメモしておきます。

throw

throwは一番単純な例外処理の方法です。以下の例を見てください。

package jp.doghouse.java.test;

class SampleException extends Exception {

}

public class ThrowSample {
	public static void main(String[] args) {
		ThrowsA a = new ThrowsA();

		try {
			SampleException e = new SampleException();
			throw e;
		} catch (SampleException e) {
			System.out.println("例外" + e + "が発生しました");
		}
	}
}

実行すると「例外jp.doghouse.java.test.SampleExceptionが発生しました。」が出力されます。

ThrowSampleクラスのtryブロックの中でthrow eが実行されるとcatchブロックの処理を実行します。

throws

throwsは例外処理を呼び出し元のメソッドに委任します。以下の例を見てください。

package jp.doghouse.java.test;

class SampleException extends Exception {

}

class ThrowsA {
	public void throwsMethod() throws SampleException {
		ThrowsB b = new ThrowsB();
		b.throwsMethod();
	}
}

class ThrowsB {
	public void throwsMethod() throws SampleException {
		SampleException e = new SampleException();
		throw e;
	}
}

public class ThrowsSample {
	public static void main(String[] args) {
		ThrowsA a = new ThrowsA();

		try {
			a.throwsMethod();
		} catch (SampleException e) {
			System.out.println("例外" + e + "が発生しました");
		}
	}
}

実行すると「例外jp.doghouse.java.test.SampleExceptionが発生しました。」が出力されます。

処理を簡単に説明すると、例外が発生したら、呼び出し元から呼び出し元に例外ハンドラ(try~catchブロック)が見つかるまで遡り続けるという動作になります。

処理の流れを順番に追っていきます。最初にtryブロックでThrowsAクラスを呼び出します。ThrowsAクラスではThrowsBクラスを呼び出します。ThrowsBクラスでthrow e;が実行されると、メソッド宣言にthrows SampleExceptionが記述されているので、呼び出し元のThrowsAクラスに例外処理を委任します。例外処理を委任されたThrowsAクラスにもメソッド宣言にthrows SampleExceptionが記述されているので、呼び出し元のThrowsSampleクラスに例外処理を委任します。例外処理を委任されたThrowsSampleクラスのcatchブロックが実行されます。

参考資料
【Java初心者向け】throwとthrowsの違いとその使い方
Javaの道:例外(3.throws、throw)