Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのIllegalArgumentExceptionの原因と解決方法を徹底解説

IllegalArgumentExceptionは、メソッドに不正な引数が渡されたことを示すためにスローされる例外です。この例外はRuntimeExceptionクラスを継承しており、Java仮想マシン(JVM)の実行中にスローされる可能性がある例外の一種に分類されます。非検査例外(unchecked exception)であるため、メソッドやコンストラクタのthrows句で宣言する必要はありません。

java.lang.IllegalArgumentExceptionが発生する主な原因

  • 引数が許容範囲外の場合: 例えば、パーセンテージは1〜100の範囲内であるべきですが、ユーザーが101を入力するとIllegalArgumentExceptionがスローされます。
  • 引数の形式が無効な場合: 例えば、メソッドが「YYYY/MM/DD」形式の日付を期待しているのに、ユーザーが「YYYY-MM-DD」形式で渡すと、メソッドがその値を解釈できずIllegalArgumentExceptionがスローされます。
  • nullが渡された場合: メソッドが空でない文字列をパラメータとして必要としているのに、null文字列が渡された場合にも発生します。

例1:IllegalArgumentExceptionの発生

public class Student {
    int m;
    public void setMarks(int marks) {
        if(marks < 0 || marks > 100)
            throw new IllegalArgumentException(Integer.toString(marks));
        else
            m = marks;
    }
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setMarks(45);
        System.out.println(s1.m);
        Student s2 = new Student();
        s2.setMarks(101);
        System.out.println(s2.m);
    }
}

実行結果

45
Exception in thread "main" java.lang.IllegalArgumentException: 101
at Student.setMarks(Student.java:5)
at Student.main(Student.java:15)

この例では、点数(marks)が0未満または100より大きい場合にIllegalArgumentExceptionをスローしています。45は有効な値なので正常に出力されますが、101を渡した時点で例外が発生し、プログラムが異常終了します。

IllegalArgumentExceptionの解決手順

  • IllegalArgumentExceptionがスローされたら、Javaのスタックトレースにあるコールスタックを確認し、誤った引数を渡した(または受け取った)メソッドを特定しましょう。
  • IllegalArgumentExceptionは非常に有用な例外であり、アプリケーションのコードが未検証の入力データを扱う状況を事前に防ぐために活用できます。
  • この例外の主な用途は、他のユーザーから入力された値のバリデーション(妥当性検証)です。
  • IllegalArgumentExceptionをキャッチしたい場合は、try-catchブロックを使用します。catchブロック内で再入力を促す処理を記述すれば、特にループ処理において、プログラムを停止させることなくユーザーにもう一度入力する機会を与えることができます。

例2:try-catchによる例外ハンドリング

import java.util.Scanner;
public class Student {
    public static void main(String[] args) {
        String cont = "y";
        run(cont);
    }
    static void run(String cont) {
        Scanner scan = new Scanner(System.in);
        while( cont.equalsIgnoreCase("y")) {
            try {
                System.out.println("Enter an integer: ");
                int marks = scan.nextInt();
                if (marks < 0 || marks > 100)
                    throw new IllegalArgumentException("value must be non-negative and below 100");
                System.out.println( marks);
            }
            catch(IllegalArgumentException i) {
                System.out.println("out of range encouneterd. Want to continue");
                cont = scan.next();  
                if(cont.equalsIgnoreCase("Y"))
                    run(cont);
                }
            }
        }
}

実行結果

Enter an integer:
1
1
Enter an integer:
100
100
Enter an integer:
150
out of range encouneterd. Want to continue
y
Enter an integer:

この例では、try-catchブロックを使ってIllegalArgumentExceptionを捕捉し、範囲外の値が入力されてもプログラムを継続できるようにしています。catchブロック内でユーザーに続行の意思を確認し、「y」が入力されれば再度整数の入力を受け付ける仕組みです。このように例外を適切にハンドリングすることで、ユーザーフレンドリーで堅牢なアプリケーションを実現できます。

  1. Javaのデフォルトメソッドを使ってダイヤモンド問題を解決する方法

    継承(Inheritance)とは 継承とは、あるクラスが別のクラスの性質(プロパティやメソッド)を受け継ぐ、2つのクラス間の関係のことです。この関係は extends キーワードを使って次のように定義します。 public class A extends B{ } 性質を受け継ぐ側のクラスは「サブクラス(子クラス)」、受け継がれる側のクラスは「スーパークラス(親クラス)」と呼ばれます。 継承が行われると、スーパークラスのメンバーのコピーがサブクラスのオブジェクト内に作成されます。そのため、サブクラスのオブジェクトを使えば、親クラスと子クラスの両方のメンバーにアクセスすることが可能です。 多重

  2. JavaでJSONをパース(解析)する方法|org.json・Gson・JsonPathの使い方を解説

    このチュートリアルでは、JavaでJSONを解析(パース)する方法を、複数のライブラリの使い方とあわせて解説します。 JSONとは「JavaScript Object Notation」の略称で、JavaScriptのサブセットをベースとした軽量なデータ形式です。 データ交換フォーマットとして広く普及しており、Webプログラミングにおいて不可欠な技術となっています。本記事では、org.jsonライブラリを使ったJSONのパース方法を中心に紹介します。 まず基本をおさらいしましょう。JSONオブジェクトは「キーと値のペア」から構成される順序のない集合です。一方、JSON配列は値が順序付けて格納さ