例外処理、なんとなく使ってませんか?Java初心者のためのやさしいエラーハンドリング入門

に公開

Javaの try-catch、なんとなく使ってきたけど
「これで本当に合ってるのかな?」
「握りつぶしてない…よね?」

そんな不安が少しでもよぎったことのある方に向けて、
今回は「Javaの例外処理」について、基礎から実務視点までやさしくまとめてみました。


☕ はじめに|例外処理を軽く見ていたあの頃の自分へ

プログラミングを始めたころ、例外処理といえば「とりあえず try-catch しておけば大丈夫」くらいの感覚でした。
でも実務でコードを読むようになると、それがとても危うい考えだったことに気づかされました。

  • catch ブロックで握りつぶされていたログ
  • スタックトレースの残っていないエラー
  • ユーザーに伝わらないメッセージ

コードの挙動と向き合えば向き合うほど、例外処理は設計そのものに関わると実感しました。


✅ 本記事でわかること

  • Javaにおける例外の種類と役割
  • try-catch の基本構文と書き方
  • throws による例外の伝播と設計の考え方
  • カスタム例外を使うべき場面と作り方
  • 実務でありがちなミスとベストプラクティス
  • 実例コードで学ぶ「読まれる例外処理」

🔍 そもそも「例外」ってなんだろう?

プログラムには、想定どおりに動く「正常系」と、想定外のトラブルが起きる「異常系」があります。

Javaでは、異常系の処理を 例外処理(Exception Handling) として設計します。

✔️ 例外の種類(ざっくり2つ)

種類 説明
Checked Exception コンパイル時に処理を強制される IOException, SQLException
Unchecked Exception 実行時に起こる/書かなくても動く NullPointerException, IllegalArgumentException

✍️ try-catch の基本

try {
    // リスクのある処理
} catch (IOException e) {
    System.out.println("ファイルが見つかりませんでした");
} finally {
    System.out.println("処理が完了しました");
}
  • try … 問題が起こりそうな処理を囲う

  • catch … 起きた例外に応じた対処をする

  • finally … 成否に関わらず最後に実行(主にリソース解放など)

🔀 throws で例外を呼び出し元に渡す

例外をその場で処理せず、「私は処理しないので、呼び出した側で対応してね」という設計もできます。

public void readFile() throws IOException {
    // throwされうる処理
}
  • try-catch → 今ここで処理する

  • throws → 呼び出し元に渡す(伝播させる)

責任の所在をどこに置くか、設計の意図が試される場面です…!

🧵 カスタム例外を作ってみる

標準の例外じゃ表現しきれない失敗、ありませんか?

public class UserNotFoundException extends Exception {
    public UserNotFoundException(String message) {
        super(message);
    }
}
  • 意味のあるクラス名で「なにが起きたか」が明確に

  • 複数の層で同じ種類の失敗を拾いやすくなる

⚠️ よくあるミスとベストプラクティス

😢 悪い例

catch (Exception e) {
    // なにも書かない、握りつぶす
}

これは“エラーを無視するコード”です…。

😊 良い例

catch (FileNotFoundException e) {
    logger.warn("ファイルが見つからない: " + e.getMessage());
}
  • catchの型は絞る

  • メッセージは明確に

  • ログ出力や通知も忘れずに

🧑‍💻 実践:ファイル読み込み処理

try (FileReader reader = new FileReader("data.txt")) {
    // 読み込み処理
} catch (FileNotFoundException e) {
    System.out.println("ファイルが存在しません");
} catch (IOException e) {
    System.out.println("読み取り中にエラーが発生しました");
}
  • try-with-resources で close() 不要に

  • 複数の catch で処理を分けると読みやすい

  • 具体的な文脈のエラーメッセージが伝わる!

✨ まとめ|例外処理は“育てる設計”

  • 例外処理はコードの“最後の守り”

  • 書いた人の気づかいや設計意図が見えるところ

  • 読まれるコードは、catchの中に思いやりがある

「とりあえず囲む」から「ちゃんと考えて書ける」へ。

この例外処理を通して、“読んで安心されるコード”を目指していきませんか?

🐻 おわりに

例外処理って、静かにコードの底力を支えてくれる存在だなと思っています。 ログに残る一言、catchに込めた意図、やさしい失敗のしかた。

これからも自分なりの「設計のやさしさ」を育てていきたいです ☕

Discussion