【问题标题】:java.lang.IllegalArgumentException: No enum constantjava.lang.IllegalArgumentException:没有枚举常量
【发布时间】:2017-08-30 13:33:04
【问题描述】:

我的枚举有问题。

这里是:

public enum DataEnum {
    NAME_PEOPLE("NAME_PEOPLE"),
    FIRSTNAME_PEOPLE("FIRSTNAME_PEOPLE"),
    ID("ID"),
    PASS("PASS"),
    NEW_MAIL("NEW_MAIL");

    private  String name;
    private DataEnum(String s) {
        name = s;
    }
    public String getValue() {
        return name;
    }
    public void setValue(String s) {
        this.name = s;
    }
}

我在那里使用它:

public String transform(String textToTransform, People people){
        Pattern TAG_REGEX = Pattern.compile("#(.+?)#");
        Matcher matcher = TAG_REGEX.matcher(textToTransform);
        while (matcher.find()) {
            String s = matcher.group(1);
            switch (s) {
                case "FIRSTNAME_PEOPLE":
                    DataEnum.valueOf(s).setValue(people.getFirstName());
                    break;
                case "NAME_PEOPLE":
                    DataEnum.valueOf(s).setValue(people.getName());
                    break;
                case "ID":
                    DataEnum.valueOf(s).setValue(people.getEmail());
                    break;
                case "PASS":
                    DataEnum.valueOf(s).setValue(people.getPassword());
                    break;
                default:
                    break;
            }
            textToTransform = textToTransform.replace("#" + DataEnum.valueOf(s) + "#", DataEnum.valueOf(s).getValue());
        }
        return textToTransform;
    }

我收到以下错误:

原因:java.lang.IllegalArgumentException:没有枚举常量 fr.pdf.utils.DataEnum.FIRSTNAME_PEOPLE

编辑:

原因:java.lang.IllegalArgumentException:没有枚举常量 fr.pdf.utils.DataEnum.FIRSTNAME_PEOPLE 在 java.lang.Enum.valueOf(Enum.java:238) 在 fr.pdf.utils.DataEnum.valueOf(DataEnum.java:3) 在 fr.pdf.services.impl.MailServiceImpl.transform(MailServiceImpl.java:160) 在 fr.pdf.services.impl.MailServiceImpl.sendMail(MailServiceImpl.java:84) 在 fr.pdf.dao.impl.People.update(People.java:372)

第 160 行对应:

textToTransform = textToTransform.replace("#" + DataEnum.valueOf(s) + "#", DataEnum.valueOf(s).getValue());

【问题讨论】:

  • 添加完整的stacktarce
  • 除了实际问题之外,修改枚举值对我来说似乎是一个真的坏主意。这基本上是全局状态。
  • 我认为 op 不明白枚举的用途
  • HashMap 怎么样? key 是标签名称,value 是 people 对象的当前值。这也适用于并发线程。您的 Enum 解决方案不会...
  • 您的String textToTransform 究竟包含什么?与#(.*?)#(此处为FIRSTNAME_PEOPLE)的第1组匹配的文本是否可能包含一些额外的(不可见的)字符?你能打印它的代码点吗(Arrays.toString(s.codePoints().toArray()) 的结果)。

标签: java enums


【解决方案1】:

删除枚举并执行此操作:)

public String transform(String textToTransform, People people){
    Pattern TAG_REGEX = Pattern.compile("#(.+?)#");
    Matcher matcher = TAG_REGEX.matcher(textToTransform);
    while (matcher.find()) {
        String s = matcher.group(1);
        String replaceWith = null;
        switch (s) {
            case "FIRSTNAME_PEOPLE":
                replaceWith = people.getFirstName();
                break;
            case "NAME_PEOPLE":
                replaceWith = people.getName();
                break;
            case "ID":
                replaceWith = people.getEmail();
                break;
            case "PASS":
                replaceWith = people.getPassword();
                break;
            default:
                break;
        }
        textToTransform = textToTransform.replace("#" + s + "#", replaceWith);
    }
    return textToTransform;
}

【讨论】:

  • 对我来说不可能,我需要将“主题标签”名称保留在某处,因为我需要在前面给出它们的列表。
  • 我的另一个解决方案是将主题标签名称存储在数据库中并将它们放在前端。但我想避免 db call。
  • 然后将标签保存在 ArrayList 中,您可以在 switch 语句之前添加额外的包含检查。但是将字符串转换为枚举以将其转换回字符串对我来说毫无意义。
  • 好的,我会改成这个。感谢您的建议。
猜你喜欢
  • 2015-11-17
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多