java枚举异常
我有枚举类java枚举异常,java,sql,Java,Sql,我有枚举类 package org.testTask.DTO; public enum Publisher { MOSCOW("МОСКВА"), ST_PETERSBURG("ПИТЕР"), O_REILLY("O’REILLY"); private String name; private long id;
package org.testTask.DTO;
public enum Publisher {
MOSCOW("МОСКВА"),
ST_PETERSBURG("ПИТЕР"),
O_REILLY("O’REILLY");
private String name;
private long id;
Publisher(final String name) {
this.name = name;
this.id = ordinal();
}
public String getName() {
return name;
}
public long getId() {
return id;
}
}
SQL请求
protected Publisher getObject(ResultSet resultSet) throws SQLException {
return Publisher.valueOf(resultSet.getString("NAME"));
}
以及数据库中的变量,其值为“МöССБА”、“ПППППСМППППППММПППППМПППППППП。但它给了我一个错误java.lang.IllegalArgumentException:没有枚举常量org.testTask.DTO.Publisher.ППППППППППМППППП
我不明白问题出在哪里。
valueOf
不能那样工作。您必须为它指定一个enum成员的名称,即valueOf(“莫斯科”)
您所称的“名称”不是枚举的名称。该名称是您可以在源代码Publisher.MOSCOW中编写的内容
为了便于按(俄语)名称查找,您需要在枚举成员列表中搜索具有匹配(俄语)名称的成员。如果你有3个以上的名字,一张地图对提高效率很有用,但我不会为少数出版商费心。你的Enum成员是英文名字,而不是俄文名字。
您应该将
MOSCOW
、ST_PETERSBURG
或O_REILLY
传递到valueOf()
。valueOf
方法返回指定枚举类型的枚举常量,并使用指定的名称,表示。valueOf(“ST_PETERSBURG”)
不是从name
字段返回
您需要将enum常量的name
字段与数据库值匹配,并获取enum
protected Publisher getObject(ResultSet resultSet) throws SQLException {
String enumName = resultSet.getString("NAME")
return Arrays.stream(Publisher.values())
.filter(e -> e.getName().equals(enumName))
.findFirst().orElse(null);
}
我需要返回与数据库中“名称”列中的值同名的发布服务器。因此,我将“NAME”传递给resultSet.getString()以获取该列中的字符串。很好,但是您被卡住了。您可以声明
enum Publisher{МССБА,ПППППППСМПППППППППППППППППППППППППППППППП。因此,您需要编写一些东西,将数据库中的数据转换为Java程序中枚举成员的名称。在枚举中有一个名为getName()
的方法是令人困惑的,考虑到还有一个方法name()
。您应该重命名它。另外,不要对id
值使用ordinal()
。首先,为什么要复制它?但另一方面,枚举中的更改很脆弱(例如,如果某种灵魂按字母顺序排列列表会怎么样?)。向构造函数提供显式id值。