例外処理(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) {
// 数値変換エラー
}
Javatry-with-resources
try (リソース型 r = new リソース型(...)) {
// r を使った処理
} catch (例外型 e) {
// エラー処理
}
Javaまとめと次の一歩
- try: 危険な処理を囲む。
- catch: 例外を捕まえて安全に処理。
- finally: 必ず実行される後始末。
- try-with-resources: リソース解放を自動化。
👉 練習課題として「ユーザー入力を数値に変換し、失敗したらメッセージを出し、最後に必ず『処理終了』と表示する」コードを書いてみると、例外処理の流れが体感できます。
