zoukankan      html  css  js  c++  java
  • 提高你的Java代码质量吧:小心switch带来的空值异常

    一、分析 

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

    我们知道,目前的Java的switch语句只能判断byte、short、char、int类型(JDK7已经允许使用string类型),为什么枚举也能跟在switch后面呢很简单,因为编译的时候,编译器判断出switch后面的参数是枚举类型,然后就会根据枚举的排序值继续匹配。如下 

     

    public static void doSports(Season season){ 
    switch(season.ordinal()){ 
        case Season.Spring.ordinal(): 
            …... 
        case Season.Summer.ordinal(): 
            …... 
        } 
    } 

    看明白了吧,switch语句先计算season变量的排序值,然后与枚举常量的每个排序值进行对比 

    二、场景 

    看这样一个例子 

     

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

    这段代码有没有问题?我们先来看看如何被调用的,因为传递的是Season类型,也就是一个实例(枚举的本质就是类)对象,那就当然允许为null了,我们就传递一个null进去看看,代码如下: 

     

    public static void main(string[] args){ 
        doSports(null); 
    }

    似乎应该打印,“输入错误!",因为在switch中没有匹配,输出default代码块。然而,我们看看真实结果 

    Exception in thread "main" java.lang.NullPointerException 

    at Client.doSports(Client.java:9) 

    at Client.main(Client.java:5) 

    怎么会是空指针异常呢?这就与枚举和switch的特性有关了,此问题也在开发中经常发生的。根据上面分析,如果season为null,无法执行ordinal方法,于是报空指针异常了。 

    三、建议 

    问题清楚了,建议在switch语句枚举前加入参数是否为null 

  • 相关阅读:
    oracle 查询 主机名和对应的IP地址
    mysql 常用命令
    linux 下 mysql-5.5.8 安装
    oracle批量插入数据(测试)
    Oracle数据库查询优化(上百万级记录如何提高查询速度)
    针对分区表一个月3个分区定期清理脚本
    C语言中%p,%u,%lu都有什么用处
    MAC下查看环境变量的值的方法
    Mac 终端 Linux 命令总结(简单命令)
    TypeScript学习-TypeScript环境配置
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3306494.html
Copyright © 2011-2022 走看看