1700446217
1700446218
Exception in thread”main”java.lang.IllegalArgumentException:No enum const class
1700446219
1700446220
Season.summer
1700446221
1700446222
at java.lang.Enum.valueOf(Enum.java:196)
1700446223
1700446224
at Season.valueOf(Client.java:1)
1700446225
1700446226
at Client.main(Client.java:13)
1700446227
1700446228
报无效参数异常,也就是说我们的summer(注意s小写)无法转换为Season枚举,无法转换就不转换嘛,那也别抛出非受检IllegalArgumentException异常啊,一旦抛出这个异常,后续的代码就不会运行了,这才是要命呀!这与我们的习惯用法非常不一致,例如我们从一个List中查找一个元素,即使不存在也不会报错,顶多indexOf方法返回-1。
1700446229
1700446230
那么来深入分析一下该问题,valueOf方法的源代码如下:
1700446231
1700446232
public static<T extends Enum<T>>T valueOf(Class<T>enumType,
1700446233
1700446234
String name){
1700446235
1700446236
//通过反射,从常量列表中查找
1700446237
1700446238
T result=enumType.enumConstantDirectory().get(name);
1700446239
1700446240
if(result!=null)
1700446241
1700446242
return result;
1700446243
1700446244
if(name==null)
1700446245
1700446246
throw new NullPointerException(“Name is null”);
1700446247
1700446248
//最后排除无效参数异常
1700446249
1700446250
throw new IllegalArgumentException(“No enum const”+enumType+”.”+name);
1700446251
1700446252
}
1700446253
1700446254
valueOf方法先通过反射从枚举类的常量声明中查找,若找到就直接返回,若找不到则抛出无效参数异常。valueOf本意是保护编码中的枚举安全性,使其不产生空枚举对象,简化枚举操作,但是却又引入了一个我们无法避免的IllegalArgumentException异常。
1700446255
1700446256
可能会有读者认为此处valueOf方法的源代码不对,这里要输入2个参数,而我们的Season.valueOf只传递一个String类型的参数。真的是这样吗?是的,因为valueOf(String name)方法是不可见的,是JVM内置的方法,我们只有通过阅读公开的valueOf方法来了解其运行原理了。
1700446257
1700446258
问题清楚了,有两个方法可以解决此问题:
1700446259
1700446260
(1)使用try……catch捕捉异常
1700446261
1700446262
这是最直接也是最简单的方式,产生IllegalArgumentException即可确认为没有相同名称的枚举项,代码如下:
1700446263
1700446264
try{
1700446265
1700446266
Season s=Season.valueOf(name);
[
上一页 ]
[ :1.700446217e+09 ]
[
下一页 ]