当前位置: 首页 > 面试题库 >

java.lang.IllegalArgumentException的原因是什么:即使通过values()进行迭代也很好,但是没有枚举const类吗?

淳于飞文
2023-03-14
问题内容

这个问题基本上是我先前问题的扩展。我问了前面的问题,以确保在类加载时填充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");
  }

关于我在这里做错什么的任何想法?


问题答案:

Enum.valueOf()仅检查常量名称,因此您需要传递它"COLUMN_HEADINGS"而不是“
columnHeadings”。您的name媒体资源与Enum内部无关。

要解决评论中的问题/担忧:

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

  1. 忘记一点命名约定,仅在最有意义的地方命名您的常量即可:enum PropName { contents, columnHeadings, ...}。这显然是最方便的。
  2. valueOf如果您确实喜欢命名约定,请在调用之前将camelCase输入转换为UPPER_SNAKE_CASE 。
  3. 实现您自己的查找方法而不是内置方法,valueOf以查找输入的相应常量。如果同一组常量有多个可能的映射,则这最有意义。


 类似资料:
  • 问题内容: 在Java 5及更高版本中,您具有foreach循环,该循环可以神奇地实现任何实现的对象: 但是,仍然没有实现,这意味着要迭代一个,您必须执行以下操作: 有谁知道为什么仍然不执行? 编辑: 为澄清起见,我不是在谈论枚举的语言概念,而是在Java API中称为“ 枚举 ” 的Java特定类。 问题答案: 枚举没有被修改为支持Iterable,因为它是一个接口,而不是一个具体的类(例如Ve

  • 问题内容: 对于最小循环,Python 3的枚举速度似乎比Python 2慢得多,而对于新版本的Python 3来说,Python 3的枚举速度似乎越来越差。 我在64位Windows机器(英特尔i7-2700K-3.5 GHz)上安装了Python 2.7.6,Python 3.3.3和Python 3.4.0,同时安装了每个Python的32位和64位版本。虽然在内存访问限制的范围内,给定版本

  • 问题内容: 我已经看过Scala有关模拟Javaenum和case类与Enumeration的问题,但是似乎付出了太多的努力却却获得了太多的好处。 基本上,我希望有一个方法可以返回的所有单例对象,而无需重复几次。 这是我的代码的样子: 该方法应该返回类似如下的内容: 一切都应该发生在特征中,所以我只需要扩展它即可获得功能。 有什么建议可以做到这一点吗?这个想法是访问类并找到它们正在扩展的类的所有单

  • 我听到一些人建议在C++中使用枚举类,因为它们的类型安全。 但这到底意味着什么呢?

  • flutter是通过什么原理和原生进行交互的?

  • 在哪些情况下,应该使用? 是否只是为了合法性问题? 如果是,那么问题是什么? 因为我仍然使用开发我的所有项目