Java 逆引き集 | 例外処理(try / catch / finally) — 安定性と後始末

Java Java
スポンサーリンク

例外処理(try / catch / finally) — 安定性と後始末

プログラムは「想定外のエラー」に出会うことがあります。ファイルが見つからない、数値が不正、ネットワークが切れる…。こうしたときに 例外処理 を使うと、プログラムが途中で止まらず「安定性」を保ち、必要な「後始末」もできます。


基本構文

try {
    // 例外が起きるかもしれない処理
} catch (例外型 e) {
    // 例外が起きたときの処理
} finally {
    // 例外の有無に関わらず必ず実行される処理
}
Java
  • try: 危険な処理を囲む。
  • catch: 例外が発生したらここに飛ぶ。
  • finally: 成否に関わらず必ず実行(リソース解放など)。

例:ファイル読み込み

import java.io.*;

public class Example {
    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("data.txt"));
            String line = br.readLine();
            System.out.println("読み込んだ行: " + line);
        } catch (IOException e) {
            System.out.println("ファイル読み込みエラー: " + e.getMessage());
        } finally {
            // 後始末(リソース解放)
            if (br != null) {
                try { br.close(); } catch (IOException e) {}
            }
        }
    }
}
Java

👉 ポイント:

  • ファイルが存在しないと IOException が発生。
  • finally で必ず close() を呼び、リソースを解放。

例外処理の設計ポイント

  • catch の粒度:
    • 広すぎると原因が分からない。
    • 狭すぎると漏れる。
    • よく使うのは IOException, NumberFormatException, NullPointerException など。
  • finally の役割:
    • ファイルやネットワーク接続のクローズ。
    • ロック解除。
    • ログ出力。
  • Java 7+ try-with-resources:
    • finally を書かなくても自動でリソース解放できる。
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
    System.out.println(br.readLine());
} catch (IOException e) {
    System.out.println("エラー: " + e.getMessage());
}
Java

例題で練習

例題1: 数値変換の失敗を処理

try {
    int n = Integer.parseInt("12a"); // 数字でない
    System.out.println(n);
} catch (NumberFormatException e) {
    System.out.println("数値に変換できません: " + e.getMessage());
}
Java

👉 入力チェックを例外で補強。


例題2: 配列アクセスの安全化

int[] arr = {1, 2, 3};
try {
    System.out.println(arr[5]); // 範囲外
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("配列の範囲外アクセス: " + e.getMessage());
}
Java

👉 範囲外アクセスをキャッチして安全に終了。


例題3: finally で後始末

try {
    System.out.println("処理開始");
    int x = 10 / 0; // 例外発生
} catch (ArithmeticException e) {
    System.out.println("ゼロ除算エラー");
} finally {
    System.out.println("必ず実行される後始末");
}
Java

👉 例外があっても finally は必ず実行。


テンプレート集

基本形

try {
    // 危険な処理
} catch (例外型 e) {
    // エラー処理
} finally {
    // 後始末
}
Java

複数 catch

try {
    // 処理
} catch (IOException e) {
    // IOエラー
} catch (NumberFormatException e) {
    // 数値変換エラー
}
Java

try-with-resources

try (リソース型 r = new リソース型(...)) {
    // r を使った処理
} catch (例外型 e) {
    // エラー処理
}
Java

まとめと次の一歩

  • try: 危険な処理を囲む。
  • catch: 例外を捕まえて安全に処理。
  • finally: 必ず実行される後始末。
  • try-with-resources: リソース解放を自動化。

👉 練習課題として「ユーザー入力を数値に変換し、失敗したらメッセージを出し、最後に必ず『処理終了』と表示する」コードを書いてみると、例外処理の流れが体感できます。

タイトルとURLをコピーしました