[英]What is the best way to handle java.lang.IllegalArgumentException: No enum constant
枚舉類是這樣的:
public enum UserRoles {
ADMIN, TEST
}
我想處理它,以便如果枚舉中沒有任何值,則不應拋出異常。 我這樣處理:
for(String roleString : roleStrings){
if(roleString.isEmpty())
continue;
UserRoles userRole;
try {
userRole = UserRoles.valueOf(roleString);
} catch(IllegalArgumentException e) {
continue;
}
accountRoles.add(userRole);
}
有更好的方法嗎?
實現此目的的一種方法是,在枚舉內部顯式創建一個靜態HashMap。 如果您期望有很多不匹配的值,則可能會很有用,因為例外通常是(相對)昂貴的操作。 否則,您的工作方式會很好。
import java.util.HashMap;
public class Test {
public static enum UserRoles {
ADMIN, USER;
private static HashMap<String, UserRoles> roles;
static {
roles = new HashMap<>();
for (UserRoles r : UserRoles.values()) {
roles.put(r.toString(), r);
}
}
public static UserRoles parse(String s) {
return roles.get(s);
}
}
public static void main(String... args) {
System.out.println(UserRoles.parse("ADMIN"));
System.out.println(UserRoles.parse("FOO"));
}
}
您可以使用Streams
以更短的方式處理它:
String
為鍵,常量為value的Map
enum UserRoles {
ADMIN, TEST;
static Map<String, UserRoles> map = Arrays.stream(values())
.collect(toMap(Enum::toString, Function.identity()));
static List<UserRoles> parseAll(List<String> roleStrings) {
return roleStrings.stream() // Stream<String>
.map(String::toUpperCase) // Stream<String>
.map(map::get) // Stream<UserRoles>
.filter(Objects::nonNull) // Stream<UserRoles>
.collect(Collectors.toList()); // List<UserRoles>
}
}
並用作
public static void main(String[] args) {
List<String> roleStrings = Arrays.asList("", "ADMIN", "te", "test");
List<UserRoles> accountRoles = UserRoles.parseAll(roleStrings);
System.out.println(accountRoles); //[ADMIN, TEST]
}
您可以引入一個靜態方法,如果找到該方法將為您獲取Enum值,否則返回null
。
enum UserRoles {
ADMIN, TEST;
public static UserRoles fetchValue(String constant) {
return Arrays.stream(UserRoles.values())
.filter(e -> e.name().equals(constant))
.findFirst()
.orElse(null);
}
}
現在,即使未找到Enum常量,也將返回null
而不是引發異常。 如下使用它:
UserRoles userRole = UserRoles.fetchValue(str);
if (userRole != null) {
accountRoles.add(userRole);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.