如何解决Java中的IllegalArgumentException
IllegalArgumentException用于指示方法被传递了非法参数。该异常继承自RuntimeException类,属于在Java虚拟机(JVM)运行期间可能抛出的异常之一。它是一个未检查的异常,因此不需要在方法或构造函数的throws子句中声明。
java.lang.IllegalArgumentException的原因
- 参数超出范围。例如,百分比应该在1至100之间。如果用户输入了101,则会抛出IllegalArgumentException。
- 参数格式无效。例如,如果我们的方法要求日期格式为YYYY/MM/DD,但用户传递的是YYYY-MM-DD。那么我们的方法无法理解,将抛出IllegalArgumentException。
- 方法需要非空字符串作为参数,但传递了null字符串。
示例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: