打字猴:1.700446249e+09
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);
1700446267
1700446268 //有该枚举项时的处理
1700446269
1700446270 System.out.println(s);
1700446271
1700446272 }catch(Exception e){
1700446273
1700446274 System.out.println(“无相关枚举项”);
1700446275
1700446276 }
1700446277
1700446278 (2)扩展枚举类
1700446279
1700446280 由于Enum类定义的方法基本上都是final类型的,所以不希望被覆写,那我们可以学习String和List,通过增加一个contains方法来判断是否包含指定的枚举项,然后再继续转换,代码如下:
1700446281
1700446282 enum Season{
1700446283
1700446284 Spring, Summer, Autumn, Winter;
1700446285
1700446286 //是否包含指定名称的枚举项
1700446287
1700446288 public static boolean contains(String name){
1700446289
1700446290 //所有的枚举值
1700446291
1700446292 Season[]season=values();
1700446293
1700446294 //遍历查找
1700446295
1700446296 for(Season s:season){
1700446297
1700446298 if(s.name().equals(name)){
[ 上一页 ]  [ :1.700446249e+09 ]  [ 下一页 ]