😸

Java言語におけるthrowとthrowsの違い(例外処理)の個人的まとめ

2022/07/14に公開

そもそも例外処理というのは二つ方法がある。

  1. try catch文を書く(前回述べた)

  2. 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:例外を報告し、例外処理を実行させる処理
    (ただ「例外発生しています〜」って報告してるだけ)

名前が似てるだけで使い所とか目的が全く違う



以上です。間違えが見つかり次第、或いは知識がアップデートされ次第改訂していきます。🙏

参考記事
参考記事

GitHubで編集を提案

Discussion