如果我得到的字符串不同于枚举上支持的字符串,如何安全地实现valueOf的使用ACTION.我的意思是ACTION.valueOf(valueToCompare)即使发生valueToCompare不是有效的枚举成员,也可以强制获取有效值
当我得到预期的执行valueToCompare是"CRY"或"CRYALOT"或"cryalot"等.
我接受java.lang.IllegalArgumentException了代码中的案例.
public enum ACTION{
CRY,
CRYALOT;
}
public static void main(String[] args) {
String valueTocompare = "posible not expected value".toUpperCase();
switch (ACTION.valueOf(valueToCompare)) {
case CRY:
System.out.println("Cry");
break;
case CRYALOT:
System.out.println("Cry a lot");
break;
default:
System.out.println("catch posible not expected value");
break;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑和使用的解决方案:
我通过使用try-catch解决了这个问题,因为@Peter Lawrey建议:
public enum ACTION{
CRY,
CRYALOT,
NOTVALID;
}
public static void main(String[] args) {
String valueToCompare = "NOTVALID";
ACTION action;
try {
valueToCompare= "variable posible not expected value".toUpperCase();
action = ACTION.valueOf(valueToCompare);
} catch(IllegalArgumentException e){
System.out.println("Handled glitch on the Matrix");
action = ACTION.NOTVALID;
}
switch (action) {
case CRY:
System.out.println("Cry");
break;
case CRYALOT:
System.out.println("Cry a lot");
break;
default:
System.out.println("catch posible not expected value");
break;
}
System.out.println("We continue normal execution on main thread...");
}
Run Code Online (Sandbox Code Playgroud)
您需要捕获IllegalArgumentException
try {
switch (ACTION.valueOf(valueToCompare)) {
}
} catch (IllegalArgumentException iae) {
// unknown
}
Run Code Online (Sandbox Code Playgroud)
或者您可以创建自己的功能来执行此操作.
public static <E extends Enum<E>> E valueOf(E defaultValue, String s) {
try {
return Enum.valueOf(defaultValue.getDeclaringClass(), s);
} catch (Exception e) {
return defaultValue;
}
}
Run Code Online (Sandbox Code Playgroud)
注意:switch(null)抛出NullPointerException而不是分支default:
使用异常进行流量控制被认为是一种不好的做法。
String valueToCompare = value.toUpperCase();
ACTION action = Arrays.stream(ACTION.values())
.filter(a -> a.name().equals(valueToCompare)).findFirst().orElse(ACTION.NOTVALID);
Run Code Online (Sandbox Code Playgroud)