打字猴:1.700446179e+09
1700446179 编写高质量代码:改善Java程序的151个建议 [:1700438159]
1700446180 编写高质量代码:改善Java程序的151个建议 建议87:使用valueOf前必须进行校验
1700446181
1700446182 我们知道每个枚举都是java.lang.Enum的子类,都可以访问Enum类提供的方法,比如hashCode、name、valueOf等,其中valueOf方法会把一个String类型的名称转变为枚举项,也就是在枚举项中查找出字面值与该参数相等的枚举项。虽然这个方法很简单,但是JDK却做了一个对于开发人员来说并不简单的处理。我们来看代码:
1700446183
1700446184 public static void main(String[]args){
1700446185
1700446186 //注意summer是小写
1700446187
1700446188 List<String>params=Arrays.asList(“Spring”,“summer”);
1700446189
1700446190 for(String name:params){
1700446191
1700446192 //查找字面值与name相同的枚举项
1700446193
1700446194 Season s=Season.valueOf(name);
1700446195
1700446196 if(s!=null){
1700446197
1700446198 //有该枚举项时
1700446199
1700446200 System.out.println(s);
1700446201
1700446202 }else{
1700446203
1700446204 //没有该枚举项
1700446205
1700446206 System.out.println(“无相关枚举项”);
1700446207
1700446208 }
1700446209
1700446210 }
1700446211
1700446212 }
1700446213
1700446214 这段程序看似很完美了,其中考虑到从String转换为枚举类型可能存在着转换不成功的情况,比如没有匹配到指定值,此时valueOf的返回值应该为空,所以后面又紧跟着if……else判断输出。这段程序真的完美无缺了吗?那我们看看运行结果:
1700446215
1700446216 Spring
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。
[ 上一页 ]  [ :1.700446179e+09 ]  [ 下一页 ]