Java 如何从XML文件加载枚举值?
我对Java还不熟悉,并且尝试解析带有ENUM参数的对象的XML文件。其中一个枚举也有一个值。在解析时,我会收到错误消息(java.lang.IllegalArgumentException:No enum常量com.codecool.enums.AreaToUse.4) 枚举是Java 如何从XML文件加载枚举值?,java,Java,我对Java还不熟悉,并且尝试解析带有ENUM参数的对象的XML文件。其中一个枚举也有一个值。在解析时,我会收到错误消息(java.lang.IllegalArgumentException:No enum常量com.codecool.enums.AreaToUse.4) 枚举是 public enum AreaToUse { TRAFICH(6), TRAFICM(5), HOMEH(4), HOMEL(3); private final int qu
public enum AreaToUse {
TRAFICH(6),
TRAFICM(5),
HOMEH(4),
HOMEL(3);
private final int qualified;
AreaToUse(int qualified) {
this.qualified = qualified;
}
public int getQualified() {
return qualified;
}
}
xml
<Lumber name="pineLong" producer="Nati" load="M" value="17.3"
qualified="4" length="3200" width="350" thickness="22"
species="pine"/>
还有解析
for (int i = 0; i < lumbers.getLength(); i++) {
current = (Element) lumbers.item(i);
result.add(new Lumber(current.getAttribute("name"),
current.getAttribute("producer"),
Load.valueOf(current.getAttribute("load")),
Double.parseDouble(current.getAttribute("value")),
AreaToUse.valueOf(current.getAttribute("qualified")),
Integer.parseInt(current.getAttribute("length")),
Integer.parseInt(current.getAttribute("width")),
Integer.parseInt(current.getAttribute("thickness")),
current.getAttribute("species")));
}
for(int i=0;i
我的预期结果是
松龙,那提,M,17.3,4,3200,350,22,松树
实际回报是
java.lang.IllegalArgumentException:No enum constant com.codecool.enums.AreaToUse.4在
enum AreaToUse
中应该有一个类似valueOfInt
的实用方法,它将限定的int
转换为相应的enum
值
public static AreaToUse valueOfInt(int i) {
return Arrays.stream(AreaToUse.values())
.filter(e -> e.getQualified() == i)
.findFirst()
.orElse(null);
}
然后像这样使用它:
AreaToUse.valueOfInt(current.getAttribute("qualified"))
如果current.getAttribute(“qualified”)
返回一个字符串,则将其解析为整数
AreaToUse.valueOfInt(Integer.parseInt(current.getAttribute("qualified")))
您必须编写一个方法,通过
qualified
值返回正确的Enum
,因为valueOf
通过给定的字符串搜索Enum
。这就是为什么会收到消息No enum constant com.codecool.enums.AreaToUse.4
。您没有被称为4
的区域
试试这个:
公共枚举区域使用{
...
公共静态区域使用byQualified(int qualified){
AreaToUse returnValue=null;
对于(AreaToUse AreaToUse:values()){
if(areaToUse.getQualified()==qualified){
返回值=区域用途;
}
}
返回值;
}
}
相反,我建议创建一个映射,将限定值映射到区域枚举:
公共枚举区域使用{
私有静态最终映射=new HashMap();
静止的{
对于(AreaToUse AreaToUse:values()){
MAPPING.put(areaToUse.getQualified(),areaToUse);
}
}
公共静态区域使用byQualified(int qualified){
返回映射.get(合格);
}
}
您的枚举值称为HOMEH
,而不是4
。因此,您必须更改XML(qualified=“HOMEH”
),或者必须在枚举中编写一些代码,以便从整数值映射到枚举值。