我是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
答案 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")))