如何解决 Java 中的 IllegalArgumentException?\

javaobject oriented programmingprogramming

抛出 IllegalArgumentException  以表明方法已传递了非法参数。此异常扩展了 RuntimeException  类,因此属于 Java 虚拟机 (JVM) 运行期间可能抛出的异常。它是一个未经检查的异常,因此不需要在方法或构造函数的 throws 子句中声明它。

java.lang.IllegalArgumentException 的原因

  • 当参数超出范围时。例如,百分比应介于 1 到 100 之间。如果用户输入 101,则会抛出 IllegalArugmentExcpetion 
  • 当参数格式无效时。例如,如果我们的方法需要 YYYY/MM/DD 这样的日期格式,但用户传递的是 YYYY-MM-DD。那么我们的方法就无法理解,则会抛出 IllegalArugmentExcpetion 
  • 当方法需要非空字符串作为参数但传递的是空字符串时。

示例 1

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)

解决 IllegalArgumentException 的步骤

  • 当抛出 IllegalArgumentException  时,我们必须检查 Java 堆栈跟踪中的调用堆栈并找到产生错误参数的方法。
  • IllegalArgumentException  非常有用,可用于避免应用程序代码必须处理未经检查的输入数据的情况。
  • IllegalArgumentException  的主要用途是验证来自其他用户的输入。
  • 如果我们想捕获 IllegalArgumentException ,那么我们可以使用 try-catch 块。通过这样做,我们可以处理一些情况。假设在 catch 块中我们放入代码,给用户另一次输入的机会,而不是停止执行,尤其是在循环的情况下。

示例2

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:

相关文章