java.lang.IllegalArgumentException的原因是什么:没有枚举const类,即使迭代遍历values()也可以正常工作?

问题描述 投票:40回答:3

这个问题基本上是我的previous question的延伸。我问上一个问题,确保在加载类时填充Enum常量。这是我的班级再次添加一个简单的方法getByName

public enum PropName {

  CONTENTS("contents"),
  USE_QUOTES("useQuotes"),
  ONKEYDOWN("onkeydown"),
  BROWSER_ENTIRE_TABLE("browseEntireTable"),
  COLUMN_HEADINGS("columnHeadings"),
  PAGE_SIZE("pageSize"),
  POPUP_TITLE("popupTitle"),
  FILTER_COL("filterCol"),
  SQL_SELECT("sqlSelect"),
  ;

  private String name;

  private PropName(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public static PropName getByName(String name){
    return   PropName.valueOf(name);
  }
}

getByName("columnHeadings")方法的调用是抛出java.lang.IllegalArgumentException: No enum const class labware.web.component.limsgrid.PropName.columnHeadings但是如果我用以下代码替换这个方法它就可以了。

 public static PropName getByName(String name){
    for(PropName prop : values()){
      if(prop.getName().equals(name)){
        return prop;
      }
    }

    throw new IllegalArgumentException(name + " is not a valid PropName");
  }

关于我在这里做错了什么想法?

java enums
3个回答
64
投票

Enum.valueOf()只检查常量名称,所以你需要传递它"COLUMN_HEADINGS"而不是“columnHeadings”。您的name财产与Enum内部无关。


要解决评论中的问题/疑虑:

枚举的“内置”(隐式声明)valueOf(String name)方法将查找具有该确切名称的枚举常量。如果您的输入是“columnHeadings”,则您(至少)有三个选择:

  1. 暂时忘掉命名约定,然后命名常量,因为它最有意义:enum PropName { contents, columnHeadings, ...}。这显然是最方便的。
  2. 如果你真的喜欢命名约定,那么在调用valueOf之前将你的camelCase输入转换为UPPER_SNAKE_CASE。
  3. 实现自己的查找方法而不是内置的valueOf来查找输入的相应常量。如果同一组常量存在多个可能的映射,则这是最有意义的。

9
投票

那是因为你为你的枚举定义了自己的name版本,getByName不使用它。

getByName("COLUMN_HEADINGS")可能会奏效。


2
投票

而不是定义:COLUMN_HEADINGS("columnHeadings")

尝试将其定义为:COLUMNHEADINGS("columnHeadings")

然后当你调用getByName(String name) method时,用这样的上部字符串调用它:getByName(myStringVariable.toUpperCase())

我和你有同样的问题,这对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.