一文講解如何解決Java中的IllegalArgumentException異常
前言
非法參數(shù)異常(IllegalArgumentException)的拋出是為了表明一個方法被傳遞了一個非法參數(shù)。該異常擴展了 RuntimeException 類,因此屬于在 Java 虛擬機(JVM)運行期間可能拋出的異常。它是一種未檢查異常,因此不需要在方法或構(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 代碼塊中加入代碼,讓用戶有機會再次輸入,而不是停止執(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ù)進行校驗是一種常見的場景,以確保參數(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ù)進行校驗同樣是一種常見的場景。當(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ù)進行校驗,以確保參數(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)文章
java中對象和Map互相轉(zhuǎn)換的幾種常見方式舉例
Map在日常開發(fā)應(yīng)用中的頻率很高,最常用的實現(xiàn)類是HashMap和有序的TreeMap,下面這篇文章主要給大家介紹了關(guān)于java中對象和Map互相轉(zhuǎn)換的幾種常見方式舉例,需要的朋友可以參考下2024-01-01springboot+nacos+gateway實現(xiàn)灰度發(fā)布的實例詳解
灰度發(fā)布是一種在軟件部署過程中用于平滑過渡的技術(shù),通過引入灰度發(fā)布SDK和配置網(wǎng)關(guān)策略實現(xiàn),本文就來介紹一下,感興趣的可以了解一下2022-03-03SpringBoot中@EnableAutoConfiguration注解的實現(xiàn)
Spring Boot@EnableAutoConfiguration是一個強大的工具,可以簡化配置過程,從而實現(xiàn)快速開發(fā),本文主要介紹了SpringBoot中@EnableAutoConfiguration注解的實現(xiàn),感興趣的可以了解一下2024-01-01SpringBoot中@Scheduled()注解以及cron表達式詳解
這篇文章主要介紹了SpringBoot中@Scheduled()注解以及cron表達式詳解,@Scheduled注解是Spring Boot提供的用于定時任務(wù)控制的注解,主要用于控制任務(wù)在某個指定時間執(zhí)行,或者每隔一段時間執(zhí)行,需要的朋友可以參考下2023-08-08手把手教你如何用JAVA連接MYSQL(mysql-connector-j-8.0.32.jar)
這篇文章主要介紹了關(guān)于如何用JAVA連接MYSQL(mysql-connector-j-8.0.32.jar)的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家學(xué)習(xí)或者使用MySQL具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01