修復 IllegalArgumentException: No enum const class
一、概述
在這篇簡短的文章中,我們將仔細研究異常“ IllegalArgumentException: No enum const class
”。
首先,我們將了解此異常背後的主要原因。然後,我們將看到如何使用實際示例重現它,最後學習如何修復它。
2. 原因
在深入細節之前,讓我們先了解異常及其堆棧跟踪的含義。
通常,當我們將非法或不適當的值傳遞給方法時,會發生IllegalArgumentException
。
“ No enum const class
”告訴我們在指定的enum
類型中沒有給定名稱的常量。
因此,此異常的最典型原因通常是使用無效的枚舉常量作為方法參數。
3.重現異常
現在我們知道了異常的含義,讓我們看看如何使用實際示例重現它。
例如,讓我們考慮Priority
枚舉:
public enum Priority {
HIGH("High"), MEDIUM("Medium"), LOW("Low");
private String name;
Priority(String name) {
this.name = name;
}
public String getPriorityName() {
return name;
}
}
如我們所見,我們的枚舉有一個私有字段name
,表示每個Priority
常量的名稱。
接下來,讓我們創建一個靜態方法來幫助我們通過name
獲取Priority
常量:
public class PriorityUtils {
public static Priority getByName(String name) {
return Priority.valueOf(name);
}
public static void main(String[] args) {
System.out.println(getByName("Low"));
}
}
現在,如果我們執行PriorityUtils
類,我們會得到一個異常:
Exception in thread "main" java.lang.IllegalArgumentException: No enum constant com.baeldung.exception.noenumconst.Priority.Low
at java.lang.Enum.valueOf(Enum.java:238)
at com.baeldung.exception.noenumconst.Priority.valueOf(Priority.java:1)
....
查看堆棧跟踪, getByName(String name)
失敗並出現異常,因為內置方法Enum.valueOf()
無法找到具有給定名稱“ Low
”的Priority
常量。
Enum.valueOf()
只接受一個字符串,該字符串必須與用於在 enum 中聲明常量的標識符完全匹配。換句話說,它只接受HIGH
、 MEDIUM
和LOW
作為參數。由於它不知道name
屬性,當我們將值“ Low”
傳遞給它時,它會拋出IllegalArgumentException
。
因此,讓我們使用測試用例來確認這一點:
@Test
void givenCustomName_whenUsingGetByName_thenThrowIllegalArgumentException() {
assertThrows(IllegalArgumentException.class, () -> PriorityUtils.getByName("Low"));
}
4.解決方案
最簡單的解決方案是在將自定義name
傳遞給Enum.valueOf()
方法之前將其轉換為大寫。
這樣,我們確保傳遞的字符串與大寫的常量名稱完全匹配。
現在,讓我們看看它的實際效果:
public static Priority getByUpperCaseName(String name) {
if (name == null || name.isEmpty()) {
return null;
}
return Priority.valueOf(name.toUpperCase());
}
為了避免任何NullPointerException
或不需要的行為,我們添加了一個檢查以確保給定的名稱不為null
且不為空。
最後,讓我們添加一些測試用例來確認一切正常:
@Test
void givenCustomName_whenUsingGetByUpperCaseName_thenReturnEnumConstant() {
assertEquals(Priority.HIGH, PriorityUtils.getByUpperCaseName("High"));
}
如我們所見,我們使用自定義名稱High
成功獲得了Priority.HIGH
。
現在,讓我們檢查一下當我們傳遞null
或空值時會發生什麼:
@Test
void givenEmptyName_whenUsingGetByUpperCaseName_thenReturnNull() {
assertNull(PriorityUtils.getByUpperCaseName(""));
}
@Test
void givenNull_whenUsingGetByUpperCaseName_thenReturnNull() {
assertNull(PriorityUtils.getByUpperCaseName(null));
}
正如我們在上面看到的,該方法確實返回null
。
5.結論
在這個簡短的教程中,我們詳細討論了導致 Java 拋出異常“ IllegalArgumentException: No enum const class
”的原因。
在此過程中,我們學習瞭如何產生異常以及如何使用實際示例修復它。
與往常一樣,示例的完整源代碼可 在 GitHub 上獲得。