コンテンツにスキップ

プログラミング/例外処理

出典: フリー教科書『ウィキブックス(Wikibooks)』

例外処理の基本概念

[編集]

例外とは何か

[編集]

例外(エクセプション)とは、プログラムの実行中に発生する予期せぬ異常や、通常の処理の流れを中断させる事象のことを指します。これは、ファイルの読み書きエラー、ネットワーク接続の問題、不正な入力値の処理など、さまざまな状況で発生します。

例外処理の重要性

[編集]

例外処理は、以下の理由から非常に重要です:

  • プログラムの安定性を確保する
  • エラー発生時の適切な対応を可能にする
  • システムの堅牢性を向上させる
  • ユーザーに有益なエラー情報を提供する

基本的な例外処理の構文

[編集]

try-catch-finally ブロック

[編集]

基本的な例外処理の構文は以下のように構成されます:

try {
    // 例外が発生する可能性のあるコード
} catch (特定の例外クラス 例外変数) {
    // 例外発生時の処理
} finally {
    // 例外の有無に関わらず常に実行されるコード
}

例外のキャッチと処理

[編集]

例外は、発生する可能性のあるコードを try ブロックで囲み、対応する catch ブロックで処理します。finally ブロックは、例外の有無に関わらず必ず実行されます。

主な例外の種類

[編集]

例外の分類

[編集]

例外は大きく2つに分類されます:

  • チェック例外(Checked Exception): コンパイル時にチェックされる例外
  • 非チェック例外(Unchecked Exception): 実行時にのみ発生する例外

代表的な例外

[編集]
  • IOException: ファイルや入出力に関連する例外
  • NullPointerException: null参照に対する操作
  • ArrayIndexOutOfBoundsException: 配列の範囲外アクセス
  • ArithmeticException: 算術的な例外(ゼロ除算など)

例外のスロー

[編集]

throw キーワード

[編集]

throw キーワードを使用して、明示的に例外をスローできます:

if (age < 0) {
    throw new IllegalArgumentException("年齢は負の値にできません");
}

独自の例外クラス作成

[編集]

独自の例外クラスを作成することで、より具体的で意味のある例外処理が可能になります:

public class CustomValidationException extends Exception {
    public CustomValidationException(String message) {
        super(message);
    }
}

例外処理のベストプラクティス

[編集]

適切な例外処理

[編集]
  • 具体的な例外をキャッチする
  • 必要以上に広範囲な例外のキャッチを避ける
  • 意味のあるエラーメッセージを提供する

例外のログ記録

[編集]

例外は、デバッグと追跡のためにログに記録することが重要です:

try {
    // 処理
} catch (SomeException e) {
    logger.error("エラーが発生しました", e);
}

リソース管理と自動クローズ

[編集]

try-with-resources

[編集]

リソースの自動クローズを行う try-with-resources 構文:

try (FileReader reader = new FileReader("example.txt")) {
    // ファイル処理
} catch (IOException e) {
    // エラー処理
}
// リソースは自動的にクローズされる

演習問題

[編集]

基本的な例外処理の実装

[編集]

ユーザー入力の年齢に対して、不正な値(負の数)が入力された場合の例外処理を実装しなさい。

カスタム例外の作成

[編集]

銀行口座の残高管理において、残高不足時にスローされるカスタム例外クラスを作成しなさい。

リソース管理

[編集]

ファイルの読み書きを行うメソッドを作成し、適切な例外処理とリソース管理を実装しなさい。

まとめ

[編集]

例外処理は、堅牢で信頼性の高いプログラムを作成するための重要な概念です。適切な例外処理により、プログラムの安定性と保守性を大幅に向上させることができます。