Javaで実務コードを書くなら、避けては通れないのが例外処理です。
「try-catchは書いてるけど、どこまで細かくやるべき?」「catchに何を書けば正解?」と悩んだ経験はありませんか?
この記事では、例外処理の基本から実践的なテクニックまでをまとめて解説します。
現場で使える知識に絞って紹介するので、エラーに強い堅牢なコードを書くための参考にしてください。
✅ そもそもJavaの例外処理とは?
Javaの例外処理は、実行時に起こる「予期しない事態」をプログラムが安全に処理するための仕組みです。
たとえば、次のようなケースが例外として扱われます。
- 配列のインデックスを超えたアクセス
- nullオブジェクトへのメソッド呼び出し
- ファイルの読み込みエラー
- ネットワーク接続の失敗
Javaではこのようなエラーを例外(Exception)クラスとして定義し、try-catch
ブロックでキャッチします。
🧩 try-catch-finallyの基本構文
try {
// 例外が発生する可能性のある処理
} catch (ExceptionType e) {
// 例外が発生したときの処理
} finally {
// 必ず実行したい処理(省略可)
}
try
: 通常処理を書く部分。例外が発生したら即中断。catch
: 発生した例外をキャッチして処理する。finally
: 例外の有無に関わらず最後に実行されるブロック(リソース開放などに使う)。
🎯 よく使う例外の種類と使い分け
Javaにはたくさんの例外クラスがありますが、よく使うのは以下の通りです
例外クラス | 内容 |
---|---|
NullPointerException | null参照を使ったとき |
ArrayIndexOutOfBoundsException | 配列の範囲外にアクセス |
IOException | ファイルやネットワークIO時の問題 |
NumberFormatException | 数値変換に失敗したとき |
SQLException | データベース操作中のエラー |
🔹ポイント
- 明確な例外をcatchするのがベスト。
Exception
で一括キャッチは避けるのが理想。 - 複数catchは上から順番に評価される。
💡 実務で使える例外処理テクニック
1. 複数catchで例外ごとに処理を分ける
try {
doSomething();
} catch (IOException e) {
logger.error("ファイル入出力エラー", e);
} catch (SQLException e) {
logger.error("DB接続エラー", e);
}
2. finallyでリソースを必ず開放する
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("data.txt"));
// 処理
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try { reader.close(); } catch (IOException ignore) {}
}
}
🔹Java 7以降は try-with-resources構文 が推奨されます。
try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {
// 自動でcloseされる
}
3. エラーログは詳細に出す(が、表示しすぎない)
logger.warn("ユーザーデータ読み込み失敗: userId=" + userId, e);
- ログ出力は業務キー+例外オブジェクトが基本。
- 開発中は
printStackTrace()
でもOKだが、本番環境ではNG。
🚫 よくあるNGパターンと対策
パターン | 問題点 | 改善策 |
---|---|---|
catch (Exception e) {} | 例外を無視する | ログを残す、明示的に握りつぶす理由を書く |
catch (Exception e) { e.printStackTrace(); } | 本番環境にスタックトレースが出る | ログフレームワークで記録する |
tryの範囲が広すぎる | どこで例外が出たか特定しづらい | 最小限のスコープでtryを書く |
🛠 カスタム例外を使うケース
業務ロジックに合わせて独自の例外クラスを作成することで、エラーの意味を明確にできます。
public class BusinessException extends Exception {
public BusinessException(String message) {
super(message);
}
}
使う側:
if (user == null) {
throw new BusinessException("ユーザーが存在しません");
}
まとめ:例外処理は「仕様の一部」
例外処理は単なるエラー対応ではなく、業務仕様を守る仕組みでもあります。
- 明示的な例外処理で意図を伝える
- catchで握りつぶさず、適切なログと再スローを意識
- try-with-resourcesでリソースリークを防止
このような実践的な例外処理を身につけることで、安定性の高いJavaアプリケーションを構築できるようになります。