JAVA練習問題2-6:例外処理を理解しよう

記事内に商品プロモーションを含む場合があります

JAVAの初心者向け問題2-6:例外処理を理解しよう

この問題を解くために必要な知識:
【レベル1の知識】
コメントの書き方、変数と定数、基本データ型とプリミティブ型、四則演算と論理演算、入力と出力(Scannerクラス)、配列、分岐処理(if、if~else、switch)、繰り返し処理(for、while、do~while)

【レベル2の知識】
メソッドの定義と呼び出し、メソッドの戻り値、メソッドのオーバーロード、例外処理(try-catch文、throws、throw)、クラスの定義と使用、インスタンス、コンストラクタ

<<前の問題 問題集Top 次の問題>>

JAVAの文法「例外処理」とは

ここでは例外処理の意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。




今回は例外処理(Exception Handling)について解説します。

プログラムを実行しているとき、予期せぬエラーが発生することがあります。例えば、ファイルが見つからなかったり、数値をゼロで割ってしまったりといったエラーです。

こういったエラーが起きたとき、プログラムが途中で止まってしまうのではなく、エラーに対処し、適切な処理を行うために例外処理が使われます。

例外とは何か?

例外(Exception)とは、プログラムの実行中に発生する予期しない問題やエラーのことです。

例外が発生すると、プログラムは通常の処理を中断し、そのエラーにどう対処するかが必要になります。例外が処理されないと、プログラムはクラッシュしてしまいます。

例外が発生する主な状況

  • ファイルが見つからない(FileNotFoundException
  • 配列の範囲外のインデックスにアクセスした(ArrayIndexOutOfBoundsException
  • 0で割り算をした(ArithmeticException

例外処理の基本構文

JAVAでは、例外を処理するためにtry-catch構文を使用します。

これにより、エラーが発生した場合にプログラムをクラッシュさせることなく、適切に対処することができます。

try {
    // 例外が発生するかもしれない処理
} catch (例外の種類 例外変数) {
    // 例外が発生した場合の処理
}

例:ゼロ除算エラーの例外処理

次の例では、数値をゼロで割った際に発生する ArithmeticException を処理しています。

public class Main {
    public static void main(String[] args) {
        try {
            int result = 10 / 0; // ここで例外が発生
            System.out.println("Result: " + result);
        } catch (ArithmeticException e) {
            System.out.println("エラー: 0で割り算をすることはできません");
        }
    }
}

実行結果:

エラー: 0で割り算をすることはできません

上記のコードでは、try ブロック内で 10 を 0 で割ろうとしています。これはエラー(例外)を引き起こしますが、catch ブロックでそのエラーを捕まえ、適切なエラーメッセージを表示しています。

このように、例外が発生してもプログラムが止まらず、正しく動作することが重要です。

複数の例外を処理する

プログラムの中で複数の異なる例外が発生する可能性があります。その場合、各例外に対して異なる catch ブロックを使って対処できます。

public class Main {
    public static void main(String[] args) {
        try {
            int[] numbers = {1, 2, 3};
            System.out.println(numbers[5]); // 配列の範囲外アクセス
            int result = 10 / 0; // 0での割り算
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("エラー: 配列の範囲外にアクセスしました");
        } catch (ArithmeticException e) {
            System.out.println("エラー: 0で割り算をすることはできません");
        }
    }
}

実行結果:

エラー: 配列の範囲外にアクセスしました

この例では、まず配列の範囲外にアクセスするエラー ArrayIndexOutOfBoundsException が発生します。

try ブロックの中で例外が発生すると、catch ブロックに移動してエラーメッセージを表示します。

複数の catch ブロックを使うことで、発生したエラーの種類に応じて異なる処理を行うことができます。

finallyブロック

try-catch 構文には、オプションでfinallyブロックを追加することができます。

finally ブロックに書かれた処理は、例外が発生したかどうかに関わらず、必ず実行されます。通常、リソースの解放や後処理を行うために使用されます。

public class Main {
    public static void main(String[] args) {
        try {
            int result = 10 / 0;
        } catch (ArithmeticException e) {
            System.out.println("エラー: 0で割り算をすることはできません");
        } finally {
            System.out.println("処理終了後に必ず実行されます");
        }
    }
}

実行結果:

エラー: 0で割り算をすることはできません
処理終了後に必ず実行されます

finally ブロックは例外が発生しても必ず実行されるため、たとえばファイルやネットワークリソースのクローズ処理を行う場合に便利です。

まとめ

  • 例外処理は、プログラムがエラーを適切に処理するための重要な仕組みです。
  • try-catch 構文を使うことで、例外が発生してもプログラムを停止させずに処理を続行できます。
  • 複数の例外catch ブロックで処理し、異なる種類のエラーに対して適切な対応が可能です。
  • finallyブロックを使うと、例外が発生しても必ず実行したい処理を記述できます。

例外処理はエラーの発生を予測して、プログラムが正しく動作し続けるために非常に重要な技術です。

実際にコーディングする際にも、適切な例外処理を行う習慣をつけましょう。




JAVA練習問題2-6_例外処理を理解しよう

ユーザーに整数を入力させ、その整数を2で割った結果を表示するプログラムを作成しましょう。

ただしユーザーが0を入力した場合には例外が発生するため、その例外を適切に処理する必要があります。

この問題の要件

以下の要件に従ってプログラムを作成して下さい。

  • ユーザーが入力する整数を受け取るために Scanner クラスを使用すること。
  • 例外が発生する可能性のある部分を try-catch 文で囲むこと。
  • catch ブロックで例外が発生した場合にエラーメッセージを表示すること。
  • 例外が発生しなかった場合に計算結果を表示すること。
  • プログラムの最後に必ず「プログラムを終了します。」というメッセージを表示すること。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

整数を入力してください: 10
10 を 2 で割った結果: 5
プログラムを終了します。

整数を入力してください: 0
エラー: 0 で割ることはできません。
プログラムを終了します。

----- ↑出力される結果の例↑ -----

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.import文
 1-1. Scannerクラスのインポート

2.DivisionProgramクラスの定義

3.mainメソッド
 3-1. Scannerオブジェクトの作成
 3-2. tryブロック
  3-2-1. ユーザーに整数の入力を促すメッセージを表示
  3-2-2. ユーザーが入力した数値をnumberに格納
  3-2-3. divideByTwoメソッドを呼び出し、結果をresultに格納
  3-2-4. 結果を表示
 3-3. catchブロック
  3-3-1. ArithmeticExceptionが発生した場合のエラーメッセージを表示
 3-4. finallyブロック
  3-4-1. プログラムの終了メッセージを表示
 3-5. Scannerオブジェクトを閉じる

4.divideByTwoメソッド
 4-1. 引数として受け取った数値を2で割る
 4-2. 結果を返す

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

import java.util.Scanner;

public class DivisionProgram {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        try {
            System.out.print("整数を入力してください: ");
            // ***ここにscannerを使用して変数に数値を代入するコードを書いてください。***
            
            // 例外が発生する可能性のある部分
            // ***ここでdivideByTwoメソッドを呼び出すコードを書いてください。***
            // ***ここで結果を表示するコードを書いてください。***
        
        } catch (ArithmeticException e) {
            // 例外が発生した場合の処理
            System.out.println("エラー: 0 で割ることはできません。");
        } finally {
            // 例外が発生してもしなくても実行される部分
            System.out.println("プログラムを終了します。");
        }

        scanner.close();
    }

    // 数値を2で割るメソッド
    // ***ここにdivideByTwoメソッドのコードを書いてください。***
}

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

********************

import java.util.Scanner;

public class DivisionProgram {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        try {
            System.out.print("整数を入力してください: ");
            int number = scanner.nextInt();
            
            // 例外が発生する可能性のある部分
            int result = divideByTwo(number);
            System.out.println(number + " を 2 で割った結果: " + result);
        
        } catch (ArithmeticException e) {
            // 例外が発生した場合の処理
            System.out.println("エラー: 0 で割ることはできません。");
        } finally {
            // 例外が発生してもしなくても実行される部分
            System.out.println("プログラムを終了します。");
        }

        scanner.close();
    }

    // 数値を2で割るメソッド
    public static int divideByTwo(int number) {
        return number / 2;
    }
}

********************

コードの解説

このコードでは、ユーザーが入力した整数を 2 で割るプログラムを作成しています。

例外処理を使って、エラーが発生した場合にもプログラムが適切に動作するようにしています。各部分を詳しく解説します。

Scannerクラスの使用

Scanner scanner = new Scanner(System.in);

まず、Scannerクラスを使ってユーザーから入力を受け取ります。System.in はコンソールから入力を読み取るためのものです。

このコードでは、ユーザーが入力する整数を取得するために使用されています。

例外処理の開始(try-catch構文)

try {
    System.out.print("整数を入力してください: ");
    int number = scanner.nextInt();
    
    // 例外が発生する可能性のある部分
    int result = divideByTwo(number);
    System.out.println(number + " を 2 で割った結果: " + result);
    
} catch (ArithmeticException e) {
    System.out.println("エラー: 0 で割ることはできません。");
} finally {
    System.out.println("プログラムを終了します。");
}

この部分では、例外処理を行っています。try ブロックの中には、エラーが発生する可能性のあるコードを記述します。

例外が発生した場合には、catch ブロックでその例外を捕まえ、エラーメッセージを表示します。

  • try ブロック: ユーザーが入力した数値を divideByTwo メソッドで 2 で割っています。この部分でエラーが発生する可能性があります。
  • catch ブロック: もし ArithmeticException が発生した場合(例えば、0 で割ろうとした場合)、このブロックが実行され、エラーメッセージが表示されます。
  • finally ブロック: 例外が発生してもしなくても、必ず実行される部分です。ここでは、プログラムが終了することを表示しています。

divideByTwoメソッド

public static int divideByTwo(int number) {
    return number / 2;
}

このメソッドは、数値を 2 で割るシンプルな処理を行っています。ここで例外が発生する可能性があるため、このメソッドを呼び出している箇所で例外処理を行っています。

まとめ

  • 例外処理とは、プログラムで予期しないエラーが発生したときに、そのエラーに対処してプログラムを停止させずに処理を続ける方法です。
  • try-catch 構文を使うことで、エラーが発生してもプログラムを安全に終了させることができます。
  • finally ブロックを使えば、例外が発生しても必ず実行したい処理を記述できます。

このプログラムでは、ユーザーから整数を受け取り、それを 2 で割る処理を行いながら、0 で割るエラー(ArithmeticException)を安全に処理する例を示しています。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    JAVA練習問題集へ戻る
    トップページへ戻る