019 例外と例外処理(例外クラス) 006 解答例

import java.util.Scanner;

// カスタム例外クラス
class MyCustomException extends Exception {
    public MyCustomException(String message) {
        super(message);
    }
}

public class CustomExceptionExample {
    public static void main(String[] args) {
        try {
            // ユーザーに割られる数を入力させる
            System.out.print("割られる数を入力してください: ");
            int dividend = getInput();

            // ユーザーに割る数を入力させる
            System.out.print("割る数を入力してください: ");
            int divisor = getInput();

            // 除算を実行
            divide(dividend, divisor);

        } catch (NumberFormatException e) {
            // 数字以外が入力された場合のエラーハンドリング
            System.out.println("エラー: 数字以外が入力されました。");
        } catch (MyCustomException e) {
            // カスタム例外が発生した場合のエラーハンドリング
            System.out.println("エラー: " + e.getMessage());
        }
    }

    // 割り算を行うメソッド
    static void divide(int num1, int num2) throws MyCustomException {
        // ゼロで割ろうとした場合はカスタム例外をスロー
        if (num2 == 0) {
            throw new MyCustomException("ゼロで割ることはできません。");
        }

        // 除算結果を表示
        int result = num1 / num2;
        System.out.println("結果: " + result);
    }

    // ユーザーからの数値入力を受け付けるメソッド
    static int getInput() throws NumberFormatException {
        Scanner scanner = new Scanner(System.in);
        // 入力された文字列を整数に変換して返す
        return Integer.parseInt(scanner.nextLine());
    }
}

この例では、割る数と割られる数をユーザーに入力させ、それらの値を用いて除算を行います。また、getInput メソッドでユーザーの入力を取得する際に、NumberFormatException が発生した場合には「エラー: 数字以外が入力されました。」と表示します。そして、divide メソッド内でゼロで割る場合には MyCustomException をスローし、「エラー: ゼロで割ることはできません。」と表示します。

例外クラス

「例外クラス」は、Javaにおいてプログラムの異常状態やエラーを表現するための仕組みです。プログラムが実行される中で発生する異常状態は、例外として扱われ、それに対処するための仕組みが整備されています。

以下に「例外クラス」に関する重要なポイントを解説します。

1. 例外の分類

Javaでは、主に以下の2つの例外の種類があります。

  • チェック例外 (Checked Exception): コンパイル時に検出できる例外。通常はプログラマが回復可能なエラーを示します。例としては IOException があります。
  • 非チェック例外 (Unchecked Exception): 実行時にのみ検出できる例外。通常はプログラマのコーディングミスや実行時の問題を示します。例としては NullPointerExceptionArrayIndexOutOfBoundsException があります。

2. 例外クラスの階層構造

Javaの例外クラスは、Throwable クラスを直接または間接的に継承しています。Throwable クラスは ErrorException という2つの主要なサブクラスを持ちます。Error は通常、プログラムが回復できない致命的なエラーを表し、Exception は通常、プログラマが回復可能なエラーを表します。

3. 例外の発生と捕捉

プログラムの実行中に例外が発生すると、その時点でプログラムの正常なフローが中断され、例外が発生した箇所から例外処理のためのコードが探索されます。例外処理の主要な要素は以下の通りです。

  • try ブロック: 例外が発生する可能性のあるコードを記述します。
  • catch ブロック: 発生した例外に対する処理を記述します。try ブロック内で発生した例外が、catch ブロックに一致する場合、その catch ブロックが実行されます。
  • finally ブロック: 例外の有無に関わらず、必ず実行されるコードを記述します。主にクリーンアップやリソース解放のために使用されます。
try {
    // 例外が発生する可能性のあるコード
} catch (SomeException e) {
    // SomeExceptionに対する処理
} finally {
    // 例外の有無にかかわらず必ず実行されるコード
}

4. カスタム例外クラスの作成

プログラマが特定の状況や要件に合わせて独自の例外クラスを作成することができます。これをカスタム例外クラスと呼び、通常は Exception クラスを拡張して実装します。これにより、特定のエラー条件に対する明示的な処理が可能になります。

class MyCustomException extends Exception {
    // コンストラクタや独自のメソッドを実装
}

例外の理解と適切な例外処理の実装は、プログラムの安定性と信頼性を向上させるために重要です。

「例外クラス」は、プログラムが予期せぬ状況に対処するための重要なツールです。エラーが発生する可能性のあるコードを try ブロック内に配置し、それに対処するためのコードを catch ブロックで定義することで、プログラムの健全性を維持することができます。また、finally ブロックを使用することで、リソースのクリーンアップなど、例外が発生しても必ず実行される処理を追加できます。

プログラムの品質向上や保守性を考えると、例外処理は欠かせない要素となります。適切なエラーメッセージやログの出力、カスタム例外の活用など、効果的な例外処理を実現するためには、しばしば状況やプロジェクトの要件に合わせた柔軟なアプローチが求められます。

例外処理の適用においては、開発者がプログラムの実行中に発生する可能性のあるさまざまな状況を予測し、それに対する適切な対処を行うことが鍵となります。プログラムの安定性と信頼性を高め、ユーザーや他の開発者との円滑なコミュニケーションを支えるために、例外クラスの理解と適切な活用が求められます。

「019 例外と例外処理」問題集リスト