【6日でできるJava入門】例外処理


 Javaプログラムでは、実行中にさまざまな予期しない事態(エラー)が発生します。たとえば「数値の入力に文字が混じっていた」「ファイルが存在しない」などが代表的です。こうした状況では、そのままプログラムを続けてしまうと誤作動やクラッシュの原因になります。
 このような「異常事態」に適切に対応する仕組みが例外処理(Exception Handling)です。例外処理を使うことで、エラー発生時にもプログラムを安全に制御し、ユーザーに分かりやすいメッセージを表示したり、プログラムを正常に終了させることができます。

1.例外とは何か

1.1. 例外(Exception)の意味と種類

 例外とは、プログラムの通常の処理では対処できない「特別な事態」を表します。Javaでは、Exceptionというクラス(およびそのサブクラス)で管理されます。

よくある例外の例

例外クラス内容
NumberFormatException数値変換に失敗したとき(例:文字をintに変換)
ArrayIndexOutOfBoundsException配列の範囲外アクセス
IOException入出力エラー
NullPointerExceptionnull参照でのメソッド呼び出し

1.2. 例外発生の具体例

例えば、ユーザーに数値を入力させるプログラムで文字を入力した場合、下記のようなエラー(例外)が発生します。

エラー例

Exception in thread "main" java.lang.NumberFormatException: For input string: "a"
  at java.lang.Integer.parseInt(Integer.java:...)
  ...

この場合、Integer.parseInt()の部分でNumberFormatExceptionが発生しています。

2.例外処理の基本構文

2.1. try-catch文の使い方

Javaでは、例外が発生しそうな部分をtryブロックで囲み、例外が発生したらcatchブロックで処理します。

基本構文

try {
    // 例外が発生するかもしれない処理
} catch (例外クラス 変数名) {
    // 例外発生時の処理
}

サンプルプログラム

ユーザーから数字を入力させ、数字でない場合も安全に再入力を促すプログラムです。

ファイル名: lesson26_1.java

public class lesson26_1 {
    public static void main(String[] args) throws java.io.IOException {
        byte[] b = new byte[128];
        int answer;
        while (true) {
            System.out.print("数字を入力してください ==> ");
            System.in.read(b);
            try {
                answer = Integer.parseInt((new String(b)).trim());
                System.out.println("入力された数字は " + answer + " です。");
                break;
            } catch (NumberFormatException e) {
                System.out.println("数字以外が入力されました。もう一度入力してください。");
            }
        }
    }
}

実行例

数字を入力してください ==> abcd
数字以外が入力されました。もう一度入力してください。
数字を入力してください ==> 123
入力された数字は 123 です。

構文解説

  • tryの中で例外が出なければcatchは実行されません。
  • 例外が出るとcatchのブロックにジャンプします。
  • catch(NumberFormatException e)で「数値変換エラー」を捕まえてエラー処理を行います。

2.2. 例外情報の取得

 catchブロックの引数で受け取った例外オブジェクトeから、発生したエラーの詳細メッセージを取得できます。

catch (NumberFormatException e) {
    System.out.println("エラー詳細: " + e.getMessage());
}

3.複数の例外に対応する

3.1. 複数catchブロック

複数の種類の例外が発生しうる場合、catchブロックを複数用意できます。

try {
    // 例外が発生するかもしれない処理
} catch (NumberFormatException e) {
    System.out.println("数値変換エラー: " + e.getMessage());
} catch (java.io.IOException e) {
    System.out.println("入出力エラー: " + e.getMessage());
}

3.2. 全ての例外を捕捉する(汎用的なcatch)

すべての例外にまとめて対処したい場合は、Exceptionクラスでcatchします。

catch (Exception e) {
    System.out.println("何らかのエラーが発生しました: " + e.getMessage());
}

4.例外を自分で発生させる(throw文)

4.1. throw文の使い方

自分で例外を発生(スロー)させることもできます。

if (age < 0) {
    throw new IllegalArgumentException("年齢が不正です: " + age);
}

4.2. throws宣言

メソッドやmain()が例外を外部に伝える場合、throwsを使って宣言します。

public static void main(String[] args) throws Exception {
    // ここに例外が発生しうる処理
}

5.まとめと補足

用語説明
try例外が発生しそうなブロック
catch発生した例外の捕捉・処理
finally必ず実行されるブロック(リソース解放など)
throw明示的に例外を発生させる
throwsメソッド定義で例外の伝播を宣言する
  • 例外処理を適切に使うことで、ユーザーにとって安全で分かりやすいプログラムを作成できます。
  • 必要に応じてfinallyブロックを使い、ファイルやネットワークリソースの解放を確実に行うとよいでしょう。