一文講解如何解決Java中的IllegalArgumentException異常
前言
非法參數(shù)異常(IllegalArgumentException)的拋出是為了表明一個方法被傳遞了一個非法參數(shù)。該異常擴(kuò)展了 RuntimeException 類,因此屬于在 Java 虛擬機(jī)(JVM)運(yùn)行期間可能拋出的異常。它是一種未檢查異常,因此不需要在方法或構(gòu)造函數(shù)的 throws 子句中聲明。
出現(xiàn) java.lang.IllegalArgumentException 的原因
- 當(dāng)參數(shù)超出范圍時。例如,百分比應(yīng)介于 1 到 100 之間。如果用戶輸入的是 101,則將拋出 IllegalArugmentExcpetion。
- 參數(shù)格式無效時。例如,如果我們的方法需要 YYYY/MM/DD 這樣的日期格式,但如果用戶傳遞的是 YYYY-MM-DD。那么我們的方法就無法理解,就會拋出 IllegalArugmentExcpetion。
- 當(dāng)一個方法需要非空字符串作為參數(shù),但傳遞的卻是空字符串時。
示例
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 的步驟
- 當(dāng)拋出 IllegalArgumentException 時,我們必須檢查 Java 堆棧跟蹤中的調(diào)用堆棧,找出產(chǎn)生錯誤參數(shù)的方法。
- IllegalArgumentException 非常有用,可用于避免應(yīng)用程序的代碼必須處理未經(jīng)檢查的輸入數(shù)據(jù)的情況。
- IllegalArgumentException 的主要用途是驗證來自其他用戶的輸入。
- 如果要捕獲 IllegalArgumentException,我們可以使用 try-catch 塊。通過這樣做,我們可以處理某些情況。假設(shè)我們在 catch 代碼塊中加入代碼,讓用戶有機(jī)會再次輸入,而不是停止執(zhí)行,尤其是在循環(huán)的情況下。
示例
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:
附:IllegalArgumentException異常常見場景
方法參數(shù)校驗
在方法中對參數(shù)進(jìn)行校驗是一種常見的場景,以確保參數(shù)的合法性。當(dāng)方法接收到一個非法的參數(shù)時,可以拋出IllegalArgumentException異常。
public void doSomething(int value) {
if (value < 0 || value > 100) {
throw new IllegalArgumentException("參數(shù)value的取值范圍必須在[0, 100]之間");
}
// 其他業(yè)務(wù)邏輯
}
構(gòu)造方法參數(shù)校驗
在構(gòu)造方法中對參數(shù)進(jìn)行校驗同樣是一種常見的場景。當(dāng)構(gòu)造方法接收到一個非法的參數(shù)時,可以拋出IllegalArgumentException異常。
public class Person {
private String name;
private int age;
public Person(String name, int age) {
if (name == null || name.isEmpty()) {
throw new IllegalArgumentException("參數(shù)name不能為空");
}
if (age < 0 || age > 150) {
throw new IllegalArgumentException("參數(shù)age的取值范圍必須在[0, 150]之間");
}
this.name = name;
this.age = age;
}
}API調(diào)用參數(shù)校驗
在調(diào)用第三方API時,有時需要對傳入的參數(shù)進(jìn)行校驗,以確保參數(shù)的合法性。當(dāng)API接收到一個非法的參數(shù)時,可以拋出IllegalArgumentException異常。
public class UserService {
public void createUser(String username, String password) {
if (username == null || username.isEmpty()) {
throw new IllegalArgumentException("參數(shù)username不能為空");
}
if (password == null || password.isEmpty()) {
throw new IllegalArgumentException("參數(shù)password不能為空");
}
// 調(diào)用第三方API創(chuàng)建用戶
}
}總結(jié)
到此這篇關(guān)于如何解決Java中的IllegalArgumentException異常的文章就介紹到這了,更多相關(guān)Java中IllegalArgumentException異常解決內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用Aspect切面攔截打印請求參數(shù)的示例代碼
這篇文章主要介紹了SpringBoot使用Aspect切面攔截打印請求參數(shù),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-07-07
SpringBoot實現(xiàn)郵件任務(wù)的步驟詳解
這篇文章主要介紹了SpringBoot實現(xiàn)郵件任務(wù)的步驟詳解,使用Spring Boot實現(xiàn)QQ郵箱發(fā)送郵件具有快速集成、統(tǒng)一的開發(fā)體驗、強(qiáng)大的維護(hù)和擴(kuò)展能力、可靠的送達(dá)性和安全性等優(yōu)勢,可以幫助你快速構(gòu)建穩(wěn)定可靠的郵件發(fā)送功能,需要的朋友可以參考下2023-10-10
SpringBoot集成Sharding-JDBC實現(xiàn)分庫分表方式
這篇文章主要介紹了SpringBoot集成Sharding-JDBC實現(xiàn)分庫分表方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
SpringSecurity配置HTTPS的實現(xiàn)
本文介紹了SpringBoot項目中配置HTTPS并集成SpringSecurity,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01

