Java の例外処理

JavaJavaIntermediate

はじめに

この実験では、Java プログラミングにおける重要な概念である Java 例外処理を学びます。これにより、コード内のエラーや予期しない状況を管理することができます。例外処理は、エラーをうまく処理してクラッシュさせないことで、プログラムをより堅牢でユーザーにやさしいものにします。

以下のトピックを扱います。

  1. 例外とは何か、そしてなぜ重要かを理解する
  2. try-catch ブロックを使って例外を処理する
  3. カスタム例外を作成してスローする
  4. クリーンアップ操作に finally ブロックを使う
  5. 複数の catch ブロックを使う

この実験が終了すると、様々なエラーシナリオを処理できる Java プログラムを書けるようになり、コードをより信頼性が高く保守しやすくすることができます。

これは Guided Lab です。学習と実践を支援するためのステップバイステップの指示を提供します。各ステップを完了し、実践的な経験を積むために、指示に注意深く従ってください。過去のデータによると、この 初級 レベルの実験の完了率は 90%です。学習者から 100% の好評価を得ています。

例外の理解

例外処理に入る前に、例外とは何か、そしてなぜ重要かを理解しましょう。

  1. ターミナルを開き、プロジェクトディレクトリに移動します。

    cd ~/project
  2. テキストエディタで ExceptionDemo.java を開きます。次の基本構造が見えるはずです。

    public class ExceptionDemo {
        public static void main(String[] args) {
            // 手順 1 でここにコードを追加します
        }
    }
  3. このファイルを変更して例外を示しましょう。main メソッドの内容を次のコードに置き換えます。

    int[] numbers = {1, 2, 3};
    System.out.println("Attempting to access the fourth element of the array...");
    System.out.println(numbers[3]);
    System.out.println("This line won't be executed due to the exception.");

    このコードは 3 つの要素を持つ配列を作成し、その後 4 番目の要素(存在しない)にアクセスしようとします。

  4. ExceptionDemo.java ファイルを保存します。

  5. プログラムをコンパイルして実行します。

    javac ExceptionDemo.java
    java ExceptionDemo

    次のようなエラーメッセージが表示されるはずです。

    Attempting to access the fourth element of the array...
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
        at ExceptionDemo.main(ExceptionDemo.java:5)

これは例外の例です。ArrayIndexOutOfBoundsException がスローされたのは、存在しない配列インデックスにアクセスしようとしているからです。プログラムは実行を続ける代わりに停止し、エラーに関する情報を提供します。

例外は、Java がエラーと異常な状況を処理する方法です。これにより、次のことができます。

  • コード内のエラーを特定して対応する
  • エラー処理コードを通常のコードから分離し、両方を理解しやすくする
  • エラー情報を呼び出しスタックに沿って伝播させる

次の手順では、これらの例外を処理してプログラムをより堅牢にする方法を学びます。

try-catch ブロックの使用

これで例外が何かを理解したので、try-catch ブロックを使って例外を処理する方法を学びましょう。

  1. 再度、テキストエディタで ExceptionDemo.java を開きます。

  2. main メソッドの内容を次のコードに置き換えます。

    int[] numbers = {1, 2, 3};
    
    try {
        System.out.println("Attempting to access the fourth element...");
        System.out.println(numbers[3]);
        System.out.println("This line won't be executed if an exception occurs.");
    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("Oops! An error occurred: " + e.getMessage());
        System.out.println("The array only has " + numbers.length + " elements.");
    }
    
    System.out.println("The program continues running after handling the exception.");

    このコードを分解してみましょう。

    • try ブロックには例外がスローされる可能性のあるコードが含まれています。
    • catch ブロックは処理できる例外の型(この場合は ArrayIndexOutOfBoundsException)を指定し、その例外が発生した場合に実行するコードを提供します。
    • try ブロックで例外が発生すると、実行はすぐに catch ブロックにジャンプします。
    • catch ブロックが実行された後、try-catch 構造の次の行からプログラムが続行します。
  3. ExceptionDemo.java ファイルを保存します。

  4. プログラムをコンパイルして実行します。

    javac ExceptionDemo.java
    java ExceptionDemo

    次のような出力が表示されるはずです。

    Attempting to access the fourth element...
    Oops! An error occurred: Index 3 out of bounds for length 3
    The array only has 3 elements.
    The program continues running after handling the exception.

これは、try-catch ブロックが例外をうまく処理する方法を示しています。クラッシュする代わりに、プログラムは有益なメッセージを表示して続行します。

カスタム例外の作成とスロー

時には、プログラム内の特定の状況を処理するために独自の例外型を作成したい場合があります。では、カスタム例外を作成してスローする方法を見てみましょう。

  1. テキストエディタで CustomException.java を開きます。現在は空であることがわかります。

  2. 次のコードを追加して、カスタム例外を定義します。

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

    これは、組み込みの Exception クラスを拡張する CustomException という新しい例外型を作成します。

  3. 次に、CustomExceptionDemo.java を開きます。次の基本構造が見えるはずです。

    public class CustomExceptionDemo {
        public static void main(String[] args) {
            // 手順 3 でここにコードを追加します
        }
    }
  4. このファイルを変更して、カスタム例外を使用しましょう。内容を次のコードに置き換えます。

    public class CustomExceptionDemo {
        public static void validateAge(int age) throws CustomException {
            if (age < 0) {
                throw new CustomException("Age cannot be negative");
            } else if (age > 120) {
                throw new CustomException("Age seems unrealistic");
            }
            System.out.println("Age is valid: " + age);
        }
    
        public static void main(String[] args) {
            try {
                System.out.println("Validating age 25:");
                validateAge(25);
                System.out.println("Validating age -5:");
                validateAge(-5);
            } catch (CustomException e) {
                System.out.println("CustomException caught: " + e.getMessage());
            }
    
            System.out.println("Program continues after exception handling");
        }
    }

    このコードは以下を示しています。

    • カスタム例外をスローするメソッド (validateAge) を作成する方法
    • throw キーワードを使用して例外をスローする方法
    • カスタム例外をキャッチして処理する方法
  5. CustomException.javaCustomExceptionDemo.java の両方を保存します。

  6. プログラムをコンパイルして実行します。

    javac CustomException.java CustomExceptionDemo.java
    java CustomExceptionDemo

    次のような出力が表示されるはずです。

    Validating age 25:
    Age is valid: 25
    Validating age -5:
    CustomException caught: Age cannot be negative
    Program continues after exception handling

この例は、カスタム例外を使用してプログラム内の特定のエラー条件を処理する方法を示しています。これにより、より意味のあるエラーメッセージを作成し、異なる種類のエラーを異なる方法で処理することができます。

finally ブロックの使用

finally ブロックは、例外がスローされたかどうかに関係なく実行する必要のあるコードを実行するために使用されます。多くの場合、クリーンアップ操作に使用されます。

  1. FinallyDemo.java を開きます。次の基本構造が見えるはずです。

    public class FinallyDemo {
        public static void main(String[] args) {
            // 手順 4 でここにコードを追加します
        }
    }
  2. main メソッドの内容を次のコードに置き換えます。

    try {
        System.out.println("Trying to divide by zero...");
        int result = 10 / 0;
        System.out.println("This line won't be executed.");
    } catch (ArithmeticException e) {
        System.out.println("Caught an exception: " + e.getMessage());
    } finally {
        System.out.println("This block always executes, regardless of exceptions.");
    }
    
    System.out.println("Program continues after the try-catch-finally block.");

    このコードは以下を示しています。

    • ゼロで割ろうとする try ブロック(ArithmeticException をスローします)
    • 例外を処理する catch ブロック
    • 例外が発生しても発生しなくても実行される finally ブロック
  3. FinallyDemo.java ファイルを保存します。

  4. プログラムをコンパイルして実行します。

    javac FinallyDemo.java
    java FinallyDemo

    次のような出力が表示されるはずです。

    Trying to divide by zero...
    Caught an exception: / by zero
    This block always executes, regardless of exceptions.
    Program continues after the try-catch-finally block.

finally ブロックは、例外がスローされたかどうかに関係なく行われるべきクリーンアップ操作(ファイルやネットワーク接続を閉じるなど)に役立ちます。

複数の catch ブロックを使う

時には、同じコードブロック内で異なる種類の例外が発生することがあります。Java では、複数の catch ブロックを使って異なる例外型を処理することができます。

  1. MultipleCatchDemo.java を開きます。次の基本構造が見えるはずです。

    public class MultipleCatchDemo {
        public static void main(String[] args) {
            // 手順 5 でここにコードを追加します
        }
    }
  2. main メソッドの内容を次のコードに置き換えます。

    try {
        int[] numbers = {1, 2, 3};
        int index = 4; // これは ArrayIndexOutOfBoundsException を引き起こします
        int result = numbers[index] / 0; // この行が実行された場合、ArithmeticException がスローされます
        System.out.println("This line won't be executed.");
    } catch (ArithmeticException e) {
        System.out.println("Caught an ArithmeticException: " + e.getMessage());
    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("Caught an ArrayIndexOutOfBoundsException: " + e.getMessage());
    } catch (Exception e) {
        System.out.println("Caught a generic Exception: " + e.getMessage());
    }
    
    System.out.println("Program continues after exception handling.");

    このコードは以下を示しています。

    • 異なる種類の例外を処理する複数の catch ブロック
    • catch ブロックの順序が重要です:より具体的な例外は、より一般的な例外よりも先にキャッチする必要があります
  3. MultipleCatchDemo.java ファイルを保存します。

  4. プログラムをコンパイルして実行します。

    javac MultipleCatchDemo.java
    java MultipleCatchDemo

    次のような出力が表示されるはずです。

    Caught an ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 3
    Program continues after exception handling.

コード内にはゼロで割ることと配列インデックスが範囲外になるという 2 つの潜在的な例外がありますが、最初に発生する ArrayIndexOutOfBoundsException のみがキャッチされます。index 変数を 2 に変更すると、代わりに ArithmeticException が表示されます。

まとめ

この実験では、堅牢で信頼性の高い Java プログラムを書く上で重要な Java の例外処理について学びました。いくつかの重要な概念を扱いました。

  1. 例外の理解:例外が何か、およびコード内のエラーをどのように管理するのかを学びました。
  2. try-catch ブロックの使用:try-catch ブロックを使って例外をうまく処理し、エラーが発生してもプログラムを継続して実行できるようにする方法を見ました。
  3. カスタム例外の作成とスロー:独自の例外型を作成し、特定のエラー条件を示すために例外をスローする方法を学びました。
  4. finally ブロックの使用:例外が発生したかどうかに関係なく実行する必要のあるコードを finally ブロックを使って実行する方法を学びました。これはクリーンアップ操作に役立ちます。
  5. 複数の catch ブロックを使う:複数の catch ブロックを使って異なる種類の例外を処理し、より具体的なエラー処理を可能にする方法を見ました。

これらの例外処理技術は、Java プログラマーのツールキットに欠かせない重要なツールです。これにより、予期しない状況をうまく処理できるより強靭なコードを書くことができ、プログラムの全体的な信頼性とユーザー体験を向上させることができます。

Java の学習を続けるにつれて、効果的な例外処理は、プロフェッショナルな品質のコードを書くための重要な要素であることがわかります。これらの技術をプログラムで練習してみると、熟練した Java 開発者になる道のりが大きく進みます!

もし、いくつかの概念が難しかったと感じた場合は大丈夫です。例外処理は複雑で、初心者にとって特にそうです。練習を続け、もしもっと明確に理解する必要がある場合は、この実験を見直したり、追加のリソースを探したりしても構いません。例外とのやり取りが多ければ多いほど、コーディングプロセスにおいて自然になります。

Morty Proxy This is a proxified and sanitized view of the page, visit original site.