例外処理はあまり触る機会が無く、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)