1. 導入:なぜ例外処理が重要なのか
Javaでプログラミングをしていると、必ず「例外(Exception)」に出会います。ファイルが見つからない、ネットワークが切れた、数値の変換に失敗したなど、予期せぬエラーが発生したときにプログラムが突然強制終了してしまったら困りますよね。try-catchブロックを適切に使うことで、エラーが発生してもプログラムを安全に終了させたり、リカバリー処理を行ったりすることが可能になります。安定したシステムを作るための第一歩です。
2. 基礎知識:Javaの例外階層を理解する
Javaの例外は「Throwable」クラスを頂点とした階層構造になっています。
Error: メモリ不足など、プログラム側では回復不可能な深刻な問題(基本的には対処不要)。
Exception: プログラムで対処すべき問題。
- Checked Exception(検査例外): コンパイル時にチェックされる例外。例外処理(try-catchなど)を記述しないとコンパイルが通りません。
- Unchecked Exception(非検査例外): 実行時に発生する例外(NullPointerExceptionなど)。記述は必須ではありませんが、発生しないよう注意が必要です。
3. 実装/解決策:効率的なエラーハンドリング
現場では以下のテクニックが多用されます。
Multi-catch: 複数の例外を一つのcatchブロックで処理します。コードの重複を減らせます。
try-with-resources: ファイルやデータベース接続など、使い終わったら閉じる必要があるリソースを自動でクローズします。finallyブロックでclose処理を書く手間が省け、バグを防げます。
4. サンプルプログラム
以下のコードは、ファイル読み込み時に起こりうるエラーを適切に処理する例です。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ExceptionSample {
public static void main(String[] args) {
// try-with-resources文: 小括弧内でリソースを宣言すると自動的にクローズされます
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
System.out.println(br.readLine());
} catch (IOException | NullPointerException e) {
// Multi-catch: 複数の例外をまとめてキャッチ(Java7以降)
System.err.println("ファイル読み込み中にエラーが発生しました: " + e.getMessage());
} catch (Exception e) {
// その他の予期せぬ例外をキャッチ
System.err.println("予期せぬエラー: " + e.getClass().getName());
}
}
}
5. 応用・注意点:現場で陥りやすい罠
初心者がやりがちな失敗は、「空のcatchブロック」を書くことです。
catchブロックの中で何も処理をしない(あるいはprintStacktraceを忘れる)と、エラーが発生しているのにプログラムがそのまま進んでしまい、原因の特定が極めて困難になります。
また、キャッチする際は、可能な限り具体的な例外クラスを指定しましょう。Exceptionクラスを広範囲にキャッチしてしまうと、本来防ぐべきバグまで隠してしまう可能性があります。
例外処理は「エラーを隠す」ためではなく、「エラーを正しく把握し、適切に制御する」ためにあるということを意識してくださいね。

コメント