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
1700446172
为了避免出现这类错误,建议在default后直接抛出一个AssertionError错误,其含义就是“不要跑到这里来,一跑到这里就会出问题”,这样可以保证在增加一个枚举项的情况下,若其他代码未修改,运行期马上就会报错,这样一来就很容易查找到错误,方便立刻排除。
1700446173
1700446174
当然也有其他方法解决此问题,比如修改IDE工具,以Eclipse为例,可以把Java→Compiler→Errors/Warnings中的“Enum type constant not covered on’switch’”设置为Error级别,如果不判断所有的枚举项就不能通过编译。
1700446175
1700446176
1700446177
1700446178
[
上一页 ]
[ :1.700446129e+09 ]
[
下一页 ]