Java 如何从XML文件加载枚举值?

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

我对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 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”
),或者必须在枚举中编写一些代码,以便从整数值映射到枚举值。