如何在Java中解决IllegalArgumentException?


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

java.lang.IllegalArgumentException的原因

  • 参数超出范围。例如,百分比应该在1到100之间。如果用户输入101,则会抛出IllegalArugmentExcpetion。

  • 参数格式无效。例如,如果我们的方法需要YYYY/MM/DD这样的日期格式,但用户传递的是YYYY-MM-DD。那么我们的方法无法理解,就会抛出IllegalArugmentExcpetion。

  • 当方法需要非空字符串作为参数,但传递了空字符串时。

示例

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:14)

解决IllegalArgumentException的步骤

  • 当抛出IllegalArgumentException时,我们必须检查Java的堆栈跟踪中的调用堆栈,并找到产生错误参数的方法。

  • IllegalArgumentException非常有用,可以用来避免应用程序代码必须处理未经检查的输入数据的情况。

  • IllegalArgumentException的主要用途是验证来自其他用户的输入。

  • 如果我们想捕获IllegalArgumentException,我们可以使用try-catch块。这样做可以处理某些情况。例如,如果我们在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:

更新于:2023年11月28日

28K+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告