打字猴:1.700446107e+09
1700446107
1700446108 at Client.main(Client.java:5)
1700446109
1700446110 竟然是空指针异常,第9行也就是switch那一行,怎么会有空指针呢?这就与枚举和switch的特性有关了,此问题也是在开发中经常发生的。我们知道,目前Java中的switch语句只能判断byte、short、char、int类型(JDK 7已经允许使用String类型),这是Java编译器的限制。问题是为什么枚举类型也可以跟在switch后面呢?
1700446111
1700446112 很简单,因为编译时,编译器判断出switch语句后的参数是枚举类型,然后就会根据枚举的排序值继续匹配,也就是说上面的代码与以下代码相同:
1700446113
1700446114 public static void doSports(Season season){
1700446115
1700446116 switch(season.ordinal()){
1700446117
1700446118 case Season.Spring.ordinal():
1700446119
1700446120 ……
1700446121
1700446122 case Season.Summer.ordinal():
1700446123
1700446124 ……
1700446125
1700446126 }
1700446127
1700446128 }
1700446129
1700446130 看明白了吧,switch语句是先计算season变量的排序值,然后与枚举常量的每个排序值进行对比的。在我们的例子中season变量是null值,无法执行ordinal方法,于是报空指针异常了。
1700446131
1700446132 问题清楚了,解决方法也很简单,在doSports方法中判断输入参数是否是null即可。
1700446133
1700446134
1700446135
1700446136
1700446137 编写高质量代码:改善Java程序的151个建议 [:1700438158]
1700446138 编写高质量代码:改善Java程序的151个建议 建议86:在switch的default代码块中增加AssertionError错误
1700446139
1700446140 switch后跟枚举类型,case后列出所有的枚举项,这是一个使用枚举的主流写法,那留着default语句似乎没有任何作用,程序已经列举了所有的可能选项,肯定不会执行到default语句,看上去纯属多余嘛!错了,这个default还是很有用的。以我们定义的日志级别来举例说明,这是一个典型的枚举常量,如下所示:
1700446141
1700446142 enum LogLevel{
1700446143
1700446144 DEBUG, INFO, WARN, ERROR;
1700446145
1700446146 }
1700446147
1700446148 一般在使用的时候,会通过swtich语句来决定用户设置的级别,然后输出不同级别的日志,代码如下:
1700446149
1700446150 switch(logLevel){
1700446151
1700446152 case DEBUG:
1700446153
1700446154 ……
1700446155
1700446156 case INFO:
[ 上一页 ]  [ :1.700446107e+09 ]  [ 下一页 ]