如何从XML文件加载ENUM的值?

时间:2019-04-11 09:24:49

标签: java

我是Java的新手,它还尝试使用具有ENUM参数的对象来解析XML文件。 ENUM之一也具有值。并在解析时收到错误消息(java.lang.IllegalArgumentException:没有枚举常量com.codecool.enums.AreaToUse.4)。

ENUM是

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")));
}

我的预期结果是

pineLong,Nati,M,17.3、4、3200、350、22,松树

实际回报为 java.lang.IllegalArgumentException:没有枚举常量com.codecool.enums.AreaToUse.4

2 个答案:

答案 0 :(得分:2)

您必须编写一种方法,该方法以Enum值返回正确的qualified,因为valueOf通过给定的Enum搜索String。这就是为什么您收到消息No enum constant com.codecool.enums.AreaToUse.4的原因。您没有名为AreaToUse的{​​{1}}。

尝试一下:

4

相反,我建议创建一个将合格值映射到区域枚举的映射:

public enum AreaToUse {
    ...
    public static AreaToUse byQualified(int qualified) {
        AreaToUse returnValue = null;
        for(AreaToUse areaToUse : values()) {
            if(areaToUse.getQualified() == qualified) {
                returnValue = areaToUse;
            }
        }
        return returnValue;
    }
}

答案 1 :(得分:0)

您应该在valueOfInt中使用类似ENUM AreaToUse的实用程序方法,该方法会将qualified int转换为corresponding 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")))