我有
java.lang.Enum.valueOf(Enum.java:238)没有枚举常量[...]
当我尝试将单个char字符串解码为枚举时。
出什么问题了,我该如何解决?
public class testEnum {
public enum Colors {
RED("R"), GREEN("G"), BLUE("B");
private final String code;
Colors(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}
public static void main(String args[]) throws Exception {
Colors c = Colors.valueOf("R");
System.out.println(c);
}
}
在这种情况下,我希望RED
进入输出控制台。
答案 0 :(得分:3)
Colors.valueOf("R")
是一个隐式声明的方法,是Enum.valueOf(Colors.class, "R")
的快捷方式。
The documentation of Enum.valueOf
状态
@param
name
要返回的常量的名称
您的常量为RED
,GREEN
和BLUE
。
答案 1 :(得分:1)
出什么问题了,我该如何解决?
Java无法知道您正在尝试传递code
字段的值来进行查找。
要解决此问题,请指定完整名称:
Colors.valueOf("RED")
或构造一个Map<String, Colors>
,您可以从中查找实例。
Map<String, Colors> map = new HashMap<>();
for (Colors colors : Colors.values()) {
map.put(colors.code, colors);
}
// Assign to a field somewhere.
// Then, later:
Colors c = map.get("R");
答案 2 :(得分:1)
从您调用的方法的文档中:
valueOf:
Returns the enum constant of this type with the specified name. The string must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)
Returns:
the enum constant with the specified name
在您的情况下,枚举“名称”将为“红色”,“绿色”或“蓝色”。或者如果您要引用枚举,则为Colors.RED.name()
如果要查找与代码相对应的Colors枚举,您可以做的就是这样:
public class Sampler {
public enum Colors {
RED("R"), BLUE("B"), GREEN("G");
private static final Map<String, Colors> COLORS_MAP;
static {
COLORS_MAP = new HashMap<>();
for(Colors color : values()) {
COLORS_MAP.put(color.code, color);
}
}
private final String code;
Colors(String code) {
this.code = code;
}
public String getCode() {
return code;
}
public static Colors fromCode(String code) {
return COLORS_MAP.get(code);
}
}
public static void main(String[] args) {
Colors c = Colors.fromCode("R");
System.out.println(c);
}
}
答案 3 :(得分:0)
我的决定
public enum Colors {
RED("R"), GREEN("G"), BLUE("B");
private final String code;
Colors(String code) {
this.code = code;
}
public String getCode() {
return code;
}
public static Colors ofCode(String code){
Colors[] values = Colors.values();
for (Colors value : values) {
if(value.code.equals(code)){
return value;
}
}
throw new IllegalArgumentException("Code not found");
}
}