6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

Javaを学んでいると、避けても通れないのが例外処理です。例外処理の基本については、こちらの記事で書いています。今回は、筆者が学習はじめのときに思った、「throws宣言って意味あるの?」について書こうと思います。
僕は、学習はじめの頃、「例外は全部try-catchで処理すればよくね?」 って思ってました。しかし、新卒でエンジニアになり本格的にコードを書くようになったいま、throwsがあることで例外処理の責任が整理され、コードがずっとわかりやすくなることに気づきました。

throwsの基本的な役割

throws宣言は、

このメソッドはこの例外を投げる可能性がありますよ

と、呼び出し元に伝える宣言です。

具体的なメリット

  1. チェック例外(例:IOException)を呼び出し元に伝えられる
  2. コードを見ている人に例外発生の可能性を明示できる
  3. 例外処理の責任を理解できる

全部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宣言を使いましょう!

最後まで読んでいただきありがとうございました(^^)

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?