小心switch带来的空值异常

简介:

使用枚举定义常量时,会伴有大量的switch语句判断,目的是伪类每个枚举项解释其行为,例如:

复制代码
 1 public class Client {
 2     public static void main(String[] args) {
 3 
 4         doSports(null);
 5     }
 6 
 7     public static void doSports(Season season) {
 8         switch (season) {
 9         case Spring:
10             System.out.println("春天放风筝");
11             break;
12         case Summer:
13             System.out.println("夏天游泳");
14             break;
15         case Autumn:
16             System.out.println("秋天捉知了");
17              break;
18         case Winter:
19             System.out.println("冬天滑冰");
20             break;
21         default:
22             System.out.println("输入错误!");
23             break;
24         }
25     }
26 }
27 
28 enum Season {
29     Spring, Summer, Autumn, Winter;
30 }
复制代码

上面的代码输入 了一个Season类型的枚举,然后使用switch进行匹配,目的是输出每个季节的活动.但是代码是否有问题?

doSports(null),似乎会打印出"输出错误",因为在switch中没有匹配到指定的值,所以会打印出default的代码块.

运行看结果:

Exception in thread "main" java.lang.NullPointerException
    at cn.summerchill.test.Client.doSports(Client.java:12)
    at cn.summerchill.test.Client.main(Client.java:8)

switch那一行报出了空指针...这就是枚举和switch的特性有关了...此问题也是在开发中经常发生.

目前Java中的switch语句只能判断byte,short,char,int类型(JDK7中已经允许使用String类型),这是Java编译器的限制,问题是为什么枚举类型也可以 跟在switch后面呢?

因为编译时,编译器判断出switch语句后面的参数是枚举类型,然后就根据枚举的排序值继续匹配,也就是说上面代码与以下代码相同:

复制代码
public class Client {
    public static void main(String[] args) {

        doSports(Season.Spring);
    }

    public static void doSports(Season season) {
        switch (season.ordinal()) {
        case Season.Spring.ordinal():
            System.out.println("春天放风筝");
            break;
        case Season.Summer.ordinal():
            System.out.println("夏天游泳");
            break;
        case Season.Autumn.ordinal():
            System.out.println("秋天捉知了");
             break;
        case Season.Winter.ordinal():
            System.out.println("冬天滑冰");
            break;
        default:
            System.out.println("输入错误!");
            break;
        }
    }
}

enum Season {
    Spring, Summer, Autumn, Winter;
}
复制代码

但是这样会报错的...在各个case语句上 报 case expressions must be constant expressions..但是书中却没有提到这一点....不知道为什么.....

switch语句是先计算season变量的排序值,然后与枚举常量的每个排序值进行对比.

在我们的例子中season的变量值是null,无法执行ordinal()方法,于是报空指针异常了.

解决方法也有很简单:在doSports()方法中判断输入的参数是否是null即可.

ordinal 单词是序数的意思. ordinal()方法获得的是从0开始的数字 .....Spring对应为0 ,Summer为1,Autumn为2,Winter为3

 


本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/5632671.html,如需转载请自行联系原作者

相关文章
|
30天前
break语句和continue语句的区别
break语句和continue语句的区别
9 0
|
2月前
枚举在 switch 中的使用
枚举在 switch 中的使用。
29 5
|
Java
case 语句块中没有 break 语句
case 语句块中没有 break 语句
259 0
|
C#
switch case语句
switch case语句
127 0
|
Java
switch case 语句有如下规则
switch case 语句有如下规则
133 0
|
PHP C#
C#(八)之判断语句IF SWITCH
IF / ELSEIF / ELSE If 满足条件择执行; 多个elseif时,其中有一个满足条件,那个之后的elseif都不会执行; else上面都不满足时执行。 Switch:这个按照正常语法写就可以了,不要忘记写break;
198 0
C#(八)之判断语句IF SWITCH
|
Java 编译器 索引
Switch竟然会报空指针异常,学到了!
前言前几天重新看 《阿里巴巴Java开发手册》有一条这样的规约:看到这,我们先可以思考下面几个问题:switch 除了 String 还支持哪种类型?为什么《阿里巴巴Java开发手册》规定String类型参数要先进行 null 判断?为什么可能会抛出空指针异常?同时switch 语句必须满足以下条件,否则会出现编译错误:与 switch 语句关联的每个 case 都必须和 switch 的表达式的类型一致;如果 switch 表达式是枚举类型,case 常量也必须是枚举类型;不允许同一个 switch 的两个 case 常量的值相同;和 switch 语句关联的常量不能为 null一个 sw
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
157 0
|
Java 开发者
switch case 支持的 6 种数据类型!
有粉丝建议可以偶尔推送一些 Java 方面的基础知识,一方面可以帮助一初学者,也可以兼顾中高级的开发者。 那么今天就讲一下 Java 中的 switch case 语句吧,有忘记的同学正好可以温习一下。 Java 中 switch case 语句用来判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
147 0
|
Java C语言
switch表达式、case穿透
记得第一次学switch的时候那是还是学习c语言的时候,整体的写if-else,switch,现在回想起来已经是很多年前的事了,好了今天让我们再来回顾下简单的switch 语法 switch(n) { case 1: 执行代码块 1 break; case 2: 执行代码块 2 b...
1810 0