はじめに
Javaを学んでいると、避けても通れないのが例外処理です。例外処理の基本については、こちらの記事で書いています。今回は、筆者が学習はじめのときに思った、「throws
宣言って意味あるの?」について書こうと思います。
僕は、学習はじめの頃、「例外は全部try-catch
で処理すればよくね?」 って思ってました。しかし、新卒でエンジニアになり本格的にコードを書くようになったいま、throws
があることで例外処理の責任が整理され、コードがずっとわかりやすくなることに気づきました。
throws
の基本的な役割
throws
宣言は、
このメソッドはこの例外を投げる可能性がありますよ
と、呼び出し元に伝える宣言です。
具体的なメリット
- チェック例外(例:IOException)を呼び出し元に伝えられる
- コードを見ている人に例外発生の可能性を明示できる
- 例外処理の責任を理解できる
全部try-catch
で処理しては行けない理由
例えば、以下のようなコードを書いたことはありませんか?
public void readFile(String path) {
try {
Files.readAllLines(Path.of(path));
} catch (IOException e) {
e.printStackTrace(); // ←呼び出し元はファイルが開けなかったことに気づけない
}
}
このコードの大きな問題点は、呼び出し元が「失敗したこと」に気づけないことです。メソッド内で例外を処理してしまっている(いわゆる、握りつぶし)ため、呼び出し元は失敗に気づけません。
throws
を使う例
throws
を使うと、呼び出し元に例外処理を委ねられます。
先ほどのコードからtry-catch
を削除し、throws
宣言を追加しました。
public void readFile(String path) throws IOException {
Files.readAllLines(Path.of(path));
}
呼び出し元では以下のように処理します。
try {
readFile("data.txt");
} catch (IOException e) {
System.out.println("ファイルを開けませんでした");
}
この例では、readfile
メソッドを呼び出すことで発生する可能性のあるIOException
を呼び出し元で処理することができています。
こうすることで、例外が発生したとき、全体のどこで、どういう例外が起きたかを把握しやすくなります。
また、メソッドを見たとき、どんな例外が発生するのか、わかりやすくなります。
まとめ
例外を全てtry-catch
で処理してはいけません
メソッド内で埋もれてしまい、例外がどこで発生したかわからなくなってしまいます。
責任分担を明示的にすることと、コード設計をわかりやすくするために、適切にthrows
宣言を使いましょう!
最後まで読んでいただきありがとうございました(^^)