【Java】解決Java報錯:IllegalArgumentException

在這里插入圖片描述

文章目錄

      • 引言
      • 1. 錯誤詳解
      • 2. 常見的出錯場景
        • 2.1 非法的參數值
        • 2.2 空值或 `null` 參數
        • 2.3 非法的數組索引
      • 3. 解決方案
        • 3.1 參數驗證
        • 3.2 使用自定義異常
        • 3.3 使用Java標準庫中的 `Objects` 類
      • 4. 預防措施
        • 4.1 編寫防御性代碼
        • 4.2 使用注解和檢查工具
        • 4.3 單元測試
      • 結語

引言

在Java編程中,IllegalArgumentException 是一種常見的運行時異常,通常發生在傳遞非法或不適當的參數給方法時。這類錯誤提示為:“IllegalArgumentException: argument is invalid”,意味著你傳遞給方法的參數不符合預期的格式或范圍。本文將詳細探討IllegalArgumentException的成因、解決方案以及預防措施,幫助開發者理解和避免此類問題,從而提高代碼的健壯性和可靠性。

1. 錯誤詳解

IllegalArgumentException 是一種由 Java 運行時環境拋出的異常,表示程序傳遞給方法的參數不合法或不適合。該異常通常在方法中進行參數驗證時拋出,以防止方法收到不合適的輸入。

2. 常見的出錯場景

2.1 非法的參數值

最常見的情況是傳遞給方法的參數值不符合預期的范圍或格式。

public class Main {public static void main(String[] args) {setAge(-5);  // 傳遞非法的年齡值,將拋出IllegalArgumentException}public static void setAge(int age) {if (age < 0 || age > 150) {throw new IllegalArgumentException("年齡必須在0到150之間");}System.out.println("年齡設置為: " + age);}
}
2.2 空值或 null 參數

傳遞空值或 null 給不接受 null 的方法參數時,也會導致 IllegalArgumentException

public class Main {public static void main(String[] args) {printName(null);  // 傳遞null值,將拋出IllegalArgumentException}public static void printName(String name) {if (name == null) {throw new IllegalArgumentException("名字不能為空");}System.out.println("名字是: " + name);}
}
2.3 非法的數組索引

當傳遞非法的索引值給數組操作方法時,也會拋出 IllegalArgumentException

public class Main {public static void main(String[] args) {int[] numbers = {1, 2, 3};setArrayValue(numbers, -1, 10);  // 傳遞非法的索引值,將拋出IllegalArgumentException}public static void setArrayValue(int[] array, int index, int value) {if (index < 0 || index >= array.length) {throw new IllegalArgumentException("索引超出數組范圍");}array[index] = value;}
}

3. 解決方案

解決IllegalArgumentException的關鍵在于確保傳遞給方法的參數符合方法的預期,并在必要時進行適當的參數驗證。

3.1 參數驗證

在方法內部進行參數驗證,以確保傳遞的參數合法。如果參數不合法,則拋出詳細的 IllegalArgumentException

public class Main {public static void main(String[] args) {try {setAge(-5);} catch (IllegalArgumentException e) {System.out.println("捕獲到異常: " + e.getMessage());}}public static void setAge(int age) {if (age < 0 || age > 150) {throw new IllegalArgumentException("年齡必須在0到150之間");}System.out.println("年齡設置為: " + age);}
}
3.2 使用自定義異常

在某些情況下,使用自定義異常可以提供更有意義的錯誤信息和處理邏輯。

public class InvalidAgeException extends IllegalArgumentException {public InvalidAgeException(String message) {super(message);}
}public class Main {public static void main(String[] args) {try {setAge(-5);} catch (InvalidAgeException e) {System.out.println("捕獲到自定義異常: " + e.getMessage());}}public static void setAge(int age) {if (age < 0 || age > 150) {throw new InvalidAgeException("年齡必須在0到150之間");}System.out.println("年齡設置為: " + age);}
}
3.3 使用Java標準庫中的 Objects

Java提供了一些工具類,如 Objects 類,可以用于簡化參數驗證。

import java.util.Objects;public class Main {public static void main(String[] args) {try {printName(null);} catch (IllegalArgumentException e) {System.out.println("捕獲到異常: " + e.getMessage());}}public static void printName(String name) {Objects.requireNonNull(name, "名字不能為空");System.out.println("名字是: " + name);}
}

4. 預防措施

4.1 編寫防御性代碼

在編寫方法時,確保對所有輸入參數進行驗證,以確保它們符合預期的范圍和格式。

public class StringUtils {public static void checkStringNotEmpty(String str, String message) {if (str == null || str.isEmpty()) {throw new IllegalArgumentException(message);}}
}
4.2 使用注解和檢查工具

利用注解(如 @NotNull@NonNull)和靜態分析工具(如 FindBugs、SonarQube),可以在編譯時和代碼檢查時發現潛在的非法參數問題。

import org.jetbrains.annotations.NotNull;public class Main {public static void printName(@NotNull String name) {System.out.println("名字是: " + name);}
}
4.3 單元測試

編寫單元測試來驗證方法的參數驗證邏輯,確保代碼在各種邊界條件下都能正確運行。

import org.junit.Test;
import static org.junit.Assert.*;public class MainTest {@Test(expected = IllegalArgumentException.class)public void testSetAgeNegative() {Main.setAge(-5);}@Test(expected = IllegalArgumentException.class)public void testPrintNameNull() {Main.printName(null);}@Testpublic void testSetAgeValid() {Main.setAge(25);  // 不應拋出異常}
}

結語

理解并有效處理IllegalArgumentException對于編寫健壯的Java程序至關重要。通過本文提供的解決方案和預防措施,開發者可以有效避免和解決這類異常,提高代碼質量和可靠性。希望本文能幫助你更好地理解和處理非法參數問題,從而編寫出更加可靠的Java應用程序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23871.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23871.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23871.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【NPS】微軟NPS配置802.1x,驗證域賬號,動態分配VLAN(有線網絡續篇)

繼上一篇文章中成功實施了有線802.1x驗證域賬號并動態分配VLAN的策略之后&#xff0c;我們迎來了一個新的目標&#xff1a;在用戶驗證失敗時&#xff0c;自動分配一個Guest VLAN&#xff0c;以確保用戶至少能夠訪問基本的網絡服務。這一改進將顯著提升網絡的靈活性和用戶的上網…

書籍數字字符串轉換為字母組合的種數(4)0607

題目&#xff1a; 給定一個字符串str&#xff0c;str全部由數字字符組成&#xff0c;如果str中某一個或某相鄰兩個字符組成的子串值在1~26之間&#xff0c;則這個子串可以轉換為一個字母。規定“1”轉換為“A”&#xff0c;“2”轉換為“B”&#xff0c;“3”轉換成“C”……“…

Kafka的分區副本機制

目錄 生產者的分區寫入策略 輪詢策略 隨機策略 按key分配策略 亂序分區 自定義分區策略 實現步驟&#xff1a; 消費者組Rebalance機制 Rebalance觸發時機 Rebalance的不良影響 消費者分區分配策略 Range范圍分配策略 RoundRobin輪詢策略 Stricky粘性分配策略 生產…

計算機網絡-NAT配置與ACL

目錄 一、ACL 1、ACL概述 2、ACL的作用 3、ACL的分類 4、ACL的配置格式 二、NAT 1、NAT概述 2、NAT分類 2.1 、 靜態NAT 2.2 、 動態NAT 3、NAT的功能 4、NAT的工作原理 三、NAT配置 1、靜態NAT配置 2、動態NAT配置 四、總結 一、ACL 1、ACL概述 ACL&#xff…

讓編程變得更加直觀與高效 “JAVA圖形化編程”官網上線!

公測預約開啟 我們歷經了長達三年的時光&#xff0c;執著地堅守并潛心地進行探索&#xff0c;始終懷著一顆敬畏的心&#xff0c;最終極為謹慎地推出了這款圖形化編程桌面。它能夠使得業務與程序清晰明了地呈現&#xff0c;而且還能與傳統的低零代碼平臺實現緊密…

新品發布 | 飛凌嵌入式RK3576核心板,為AIoT應用賦能

為了充分滿足AIoT市場對高性能、高算力和低功耗主控日益增長的需求&#xff0c;飛凌嵌入式全新推出基于Rockchip RK3576處理器開發設計的FET3576-C核心板&#xff01; 集成4個ARM Cortex-A72和4個ARM Cortex-A53高性能核&#xff0c;內置6TOPS超強算力NPU&#xff0c;為您的AI…

LeetCode 兩數之和 + 三數之和

兩數之和 簡單題 思路&#xff1a;一個Map&#xff0c;key是數值&#xff0c;value是該數值對應的下標&#xff0c;遍歷的時候判斷一下當前數組下標對應的值在map里有沒有可組合成target的&#xff08;具體體現為在map里找target-nums【i】)&#xff0c;如果有&#xff0c;直接…

IDEA使用阿里通義靈碼插件

在這個AI火熱的時代&#xff0c;純手工寫代碼已經有點out了&#xff0c;使用AI插件可以幫我們快速寫代碼&#xff0c;起碼能省去寫那些簡單、重復性的代碼&#xff0c;大大提高編碼效率&#xff0c;在這里我推薦使用阿里的通義靈碼 注冊安裝 安裝注冊好后&#xff0c;打開我們…

深入探索Spark MLlib:大數據時代的機器學習利器

隨著大數據技術的迅猛發展,機器學習在各行各業的應用日益廣泛。Apache Spark作為大數據處理的利器,其內置的機器學習庫MLlib(Machine Learning Library)提供了一套高效、易用的工具,用于處理和分析海量數據。本文將深入探討Spark MLlib,介紹其核心功能和應用場景,并通過…

【流媒體】音頻相關概念詳解

文章目錄 一、前言二、概述三、音頻相關概念1、采樣率&#xff08;Sampling rate&#xff09;2、位深度&#xff08;Bit depth&#xff09;3、比特率&#xff08;Bit rate&#xff09;4、聲道&#xff08;Audio channel&#xff09;5、音頻幀6、音頻編碼7、音頻解碼 一、前言 …

【vuejs】$nextTick的原理分析和使用場景

1. $nextTick 概述 Vue.js 框架中的 $nextTick 是一個非常重要的 API&#xff0c;它允許開發者延遲回調函數的執行直到下次 DOM 更新循環之后。這意味著&#xff0c;當開發者在 Vue 組件中更改了數據&#xff0c;并且想要在 DOM 更新完成后執行某些操作時&#xff0c;可以使用…

總結開發過程遇到問題有哪些渠道可以尋找解決方案

羅列一下 百度、ChatGPT/訊飛星火等AI、Stack Overflow、github isssue 平時開發過程遇到問題的主要解決方式都是百度或者詢問ChatGPT&#xff0c;當然在java中這兩個方式也能解決百分之80的問題&#xff0c;畢竟java的社區圈夠熱鬧。 如何優雅地使用 Stack Overflow 一、學…

搭建自己的DNS服務器

個人名片 &#x1f393;作者簡介&#xff1a;java領域優質創作者 &#x1f310;個人主頁&#xff1a;碼農阿豪 &#x1f4de;工作室&#xff1a;新空間代碼工作室&#xff08;提供各種軟件服務&#xff09; &#x1f48c;個人郵箱&#xff1a;[2435024119qq.com] &#x1f4f1…

腺苷調節合成高密度脂蛋白用于三陰性乳腺癌的化學免疫治療

引用信息 文 章&#xff1a;Adenosine-modulating synthetic high-density lipoprotein for chemoimmunotherapy of triple-negative breast cancer 期 刊&#xff1a;Journal of Controlled Release&#xff08;影響因子&#xff1a;10.8&#xff09; 發表時間&am…

深入探索:十種流行的深度神經網絡及其運作原理

算法 深入探索&#xff1a;十種流行的深度神經網絡及其運作原理一、卷積神經網絡&#xff08;CNN&#xff09;基本原理工作方式 二、循環神經網絡&#xff08;RNN&#xff09;基本原理工作方式 三、長短期記憶網絡&#xff08;LSTM&#xff09;基本原理工作方式 四、門控循環單…

jupyter notebook默認工作目錄修改

jupyter notebook默認工作目錄修改 1、問題2、如何修改jupyter notebook默認工作目錄 1、問題 anaconda安裝好之后&#xff0c;我們啟動jupyter notebook會發現其默認工作目錄是在C盤&#xff0c;將工作目錄放在C盤會讓C盤很快被撐爆&#xff0c;我們應該將jupyter notebook默…

進階篇01——存儲引擎

MySQL體系結構 存儲引擎 引擎有多種類型&#xff0c;MySQL支持多種存儲引擎&#xff0c;默認的存儲引擎為innodb。不同的存儲引擎有不同的特點&#xff0c;適用不同的場景。 innodb存儲引擎 簡介 innodb的邏輯存儲結構 MYISAM存儲引擎 memory存儲引擎 三種引擎特點對比&…

2024華為數通HCIP-datacom最新題庫(變題更新③)

請注意&#xff0c;華為HCIP-Datacom考試831已變題 請注意&#xff0c;華為HCIP-Datacom考試831已變題 請注意&#xff0c;華為HCIP-Datacom考試831已變題 近期打算考HCIP的朋友注意了&#xff0c;如果你準備去考試&#xff0c;還是用的之前的題庫&#xff0c;切記暫緩。 1、…

融合創新:Web3如何重新定義網絡生態

隨著區塊鏈技術的不斷發展和Web3時代的到來&#xff0c;我們正在見證著互聯網生態的巨大變革。Web3將傳統的互聯網架構轉變為去中心化、開放、透明的新網絡生態&#xff0c;為創新和合作提供了全新的可能性。本文將深入探討Web3如何重新定義網絡生態&#xff0c;探索融合創新的…

Flutter中防抖動和節流策略

什么是防抖和節流&#xff1f; 函數節流&#xff08;throttle&#xff09;與 函數防抖&#xff08;debounce&#xff09;都是為了限制函數的執行頻次&#xff0c;以優化函數觸發頻率過高導致的響應速度跟不上觸發頻率&#xff0c;出現延遲&#xff0c;假死或卡頓的現象 是應對頻…