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
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:
1700446157
1700446158
……
1700446159
1700446160
case WARN:
1700446161
1700446162
……
1700446163
1700446164
case ERROR:
1700446165
1700446166
……
1700446167
1700446168
}
1700446169
1700446170
由于把所有的枚举项都列举完了,不可能有其他值,所以就不需要default代码块了,这是普遍的认识,但问题是我们的switch代码与枚举之间没有强制约束关系,也就是说两者只是在语义上建立了联系,并没有一个强制约束,比如LogLevel枚举发生改变,增加了一个枚举项FATAL,如果此时我们对switch语句不做任何修改,编译虽不会出现问题,但是运行期会发生非预期的错误:FATAL类型的日志没有输出。
1700446171
[
上一页 ]
[ :1.700446122e+09 ]
[
下一页 ]