MENU

【Java】レッスン2-09:例外処理の基本と使い方|try-catch・finally構文をマスター

tggaa478@yahoo.co.jp

一つ前のページではエラーメッセージについて学習しました。

今回は 例外処理 について見ていきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編

 ・Lesson2-1:比較演算子と論理演算子を理解しよう
 ・Lesson2-2:if文による分岐処理を理解しよう
 ・Lesson2-3:switch文による分岐処理を理解しよう
 ・Lesson2-4:for文による繰り返し処理を理解しよう
 ・Lesson2-5:while文による繰り返し処理を理解しよう
 ・Lesson2-6:繰り返しを制御しよう
 ・Lesson2-7:配列を理解しよう
 ・Lesson2-8:エラーメッセージを読めるようになろう
 ・Lesson2-9:例外処理を理解しよう ◁今回はココ
 ・確認問題2-☆1:ハイアンドロー ゲームを作ろう
 ・確認問題2-☆2:数字当てゲームを作ろう
 ・確認問題2-☆3:じゃんけんゲームを作ろう
Lesson3:メソッド編
Lesson4:コレクション編
Lesson5:クラス

<<前のページ

学習記事一覧

次のページ>>

Javaの例外処理とは?基本構文と目的を初心者向けに解説

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

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

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

例外(Exception)とは何か?Javaでの定義と発生例を解説

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

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

例外が処理されないとプログラムはクラッシュしてしまいます。

例外が発生する主な状況

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

try-catch構文の使い方|Javaで例外を安全に処理する方法

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で例外を個別に処理する方法|具体例と使い分け

プログラムの中で複数の異なる例外が発生する可能性があります。

その場合、各例外に対して異なる 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 ブロックは例外が発生しても必ず実行されるため、たとえばファイルやネットワークリソースのクローズ処理を行う場合に便利です。

Javaの例外処理まとめ|基本の構文と使い所をふり返ろう

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

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

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

練習問題|Scannerと例外処理で安全な整数入力プログラムを作ろう

ユーザーに整数の入力を求め、入力された整数を表示するプログラムを作成してください。

ユーザーが整数以外の値を入力した場合にはエラーメッセージを表示し、プログラムの終了を通知します。

またすべての操作が終わった際にリソースを解放するようにします。

このプログラムを通して、例外処理の基本的な使い方を学びましょう。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • Scanner クラスを使い、ユーザーから整数を入力させること。
  • ユーザーが入力した内容を整数として取得し、その値を表示すること。
  • 整数以外が入力された場合は、Exceptionをキャッチして「エラー: 整数を入力してください。」というエラーメッセージを表示すること。
  • try-catch ブロックの最後に「プログラムを終了します。」と表示すること。
  • finally ブロックで Scanner のリソースを解放すること。

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

整数を入力してください:abc
エラー: 整数を入力してください。
プログラムを終了します。

この問題を解くヒント

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

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

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

1:Scannerクラスをインポート
2:Mainクラスの定義
  □ mainメソッドの定義
  □ □ Scannerオブジェクトscannerの初期化
  □ □ 「整数を入力してください:」と出力
  □ □ tryブロックの開始
  □ □ □ ユーザーからの入力を整数として読み取り、変数numberに代入
  □ □ □ 「入力された整数は ” + number + ” です。」と出力
  □ □ catchブロックの開始
  □ □ □ 整数以外が入力された場合、「エラー: 整数を入力してください。」と出力
  □ □ finallyブロックの開始
  □ □ □ 「プログラムを終了します。」と出力
  □ □ □ scannerを閉じてリソースを解放

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

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

import java.util.Scanner;

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

        // ユーザーに整数の入力を求める
        System.out.print("整数を入力してください:");

        /*【穴埋め問題1】
        ここにtryブロックを作成し、ユーザーから整数を読み取り、それを変数numberに代入するコードを書いてください。
        */

        /*【穴埋め問題2】
        ここにcatchブロックを作成し、例外が発生した場合に「エラー: 整数を入力してください。」と表示するコードを書いてください。
        */

        /*【穴埋め問題3】
        ここにfinallyブロックを作成し、「プログラムを終了します。」と表示し、scannerを閉じるコードを書いてください。
        */

    }
}

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

練習問題の解答と解説

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
import java.util.Scanner;

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

        // ユーザーに整数の入力を求める
        System.out.print("整数を入力してください:");

        try {
            // 入力を整数として読み取る
            int number = scanner.nextInt();

            // 入力が成功した場合に表示するメッセージ
            System.out.println("入力された整数は " + number + " です。");

        } catch (Exception e) {
            // 例外が発生した場合のメッセージ
            System.out.println("エラー: 整数を入力してください。");

        } finally {
            // try-catch ブロックの終了を知らせる
            System.out.println("プログラムを終了します。");
            // リソースの解放
            scanner.close();
        }
    }
}
Q
正解コードの解説

コードをブロックごとに分割して解説します。

インポート文の導入

import java.util.Scanner;

最初にJavaのScannerクラスをインポートしています。

このクラスはユーザーからの入力を受け取るために使用されます。

クラスとメインメソッドの定義

public class Main {
    public static void main(String[] args) {

Mainというクラスを定義し、その中でmainメソッドを定義しています。

mainメソッドはJavaプログラムのエントリーポイントであり、プログラムを実行するとここからコードが開始されます。

Scannerオブジェクトの初期化

        Scanner scanner = new Scanner(System.in);

Scannerオブジェクトを作成し、標準入力(通常はキーボード)からユーザー入力を受け取る準備をしています。

このscannerオブジェクトを使用してユーザーからの入力を読み取ります。

ユーザーへの入力指示

        System.out.print("整数を入力してください:");

この行はユーザーに「整数を入力してください:」というメッセージを表示し、入力を待機する状態にします。

tryブロックでの例外処理の開始

        try {
            int number = scanner.nextInt();
            System.out.println("入力された整数は " + number + " です。");
        }

この部分ではtryブロックを使用して、ユーザーが入力したデータを整数として読み取ります。

具体的にはscanner.nextInt()メソッドを使って、ユーザーが入力した値をint型の変数numberに格納し、読み取りが成功した場合にはその値を表示します。

tryブロックは「エラーが発生し得る処理」を囲むために使用します。

catchブロックでのエラー処理

        } catch (Exception e) {
            System.out.println("エラー: 整数を入力してください。");
        }

もしユーザーが整数以外の値(例えば文字列や記号)を入力すると、scanner.nextInt()でエラー(例外)が発生します。

この場合catchブロックが実行され、「エラー: 整数を入力してください。」というメッセージが表示されます。

これが例外処理で、tryブロックでエラーが発生した際に、catchブロックでエラーメッセージを表示してプログラムが異常終了しないようにします。

finallyブロックでの後処理

        } finally {
            System.out.println("プログラムを終了します。");
            scanner.close();
        }

finallyブロックはtrycatchブロックの処理が終わった後に必ず実行される部分です。

ここでは「プログラムを終了します。」というメッセージを表示し、最後にscanner.close()Scannerオブジェクトを閉じています。

リソースの解放はプログラムの健全な動作を保つために重要です。

まとめ

このコードでは例外処理の基礎であるtry-catch-finally構文を使い、ユーザーからの入力に対してエラーが発生してもプログラムが正常に終了する方法を学びました。

例外処理はプログラムの予期しないエラーに対処するための重要な仕組みです。

これを理解し、使いこなせるようになると、より安定したプログラムを作成することができるようになります。

ぜひ実践で活用してみてください!

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいJava学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

学習記事一覧

次のページ>>

記事URLをコピーしました