Java言語におけるthrowとthrowsの違い(例外処理)の個人的まとめ
そもそも例外処理というのは二つ方法がある。
-
try catch文を書く(前回述べた)
-
throwsで呼び出し元に例外を投げる(例外をかわす)
の二つの方法である。
今回は後者の「例外をかわす(throws)」ことに焦点を当て、throwとの違いに触れる。
throwsとは
throwsはメソッド内で例外が発生した場合、自分のメソッド内でcatchするのではなく、呼ばれる側に例外を投げる処理のこと。
※throwsが書かれたメソッドを呼び出す場合はtry catch文が必要。
void testB () throws FileNotFoundException { //・・・①
FileReader r = new FileReader(“sample.txt”); //・・・②
System.out.print(“ファイルを読み込みました”);
}
void testC () { //・・・③
try {
testB(); //・・・④
} catch (FileNotFoundException e) { //・・・⑤
System.out.print(“ファイルが存在しませんでした”); //・・・⑥
}
}
①の下記1文でメソッド内で起こりうる例外を指定して、その例外を呼び出し元に投げる
②で「sample.txt」というファイルを読み込む処理を行っているが、「sample.txt」ファイルが存在しない場合「FileNotFoundException」例外が発生
③testCメソッド内ではtry catch文が書かれており、例外をcatchできるようになっている。
④でファイルを読み込むtestBメソッドを呼び出している。**ここで呼び出したtestBメソッドで例外が発生した場合、例外がtestBメソッドからtestCメソッドに投げられる(回避される)**ため、⑤で(回避され、渡ってきた例外が)catchされ、⑥の「ファイルが存在しませんでした」が出力される。
throw 復習
throwは例外を意図的に起こして、例外処理を行わせる。
void testA (int num) { //・・・①
if(num == 0) { //・・・②
throw new IllegalArgumentException(“引数の値が不正です”); //・・・③
}
}
①のメソッドtestAでは引数に「num」という数値型を指定。
②のif文は引数の「num」が0だった場合に特定の処理を行おうとしている。
③の「IllegalArgumentException」は不正な引数、または不適切な引数をメソッドに渡したことを示すための例外だ。このようにthrowを使うことで、プログラマが例外を意図的に呼び出すことができる。
まとめ
両者の違いは
-
throws:メソッド内で例外が発生した場合、自分のメソッド内でcatchするのではなく、呼ばれる側に例外を投げる処理
(処理をより上位のメソッドに流せるわけだ) -
throw:例外を報告し、例外処理を実行させる処理
(ただ「例外発生しています〜」って報告してるだけ)
名前が似てるだけで使い所とか目的が全く違う
以上です。間違えが見つかり次第、或いは知識がアップデートされ次第改訂していきます。🙏
Discussion