浅析Java布尔类型引起的空指针问题:boolean与Boolean的区别与使用、boolen赋值为null和Boolean作为 if 判断条件的2种空指针情况

一、问题背景

  发现有个布尔类型的参数,不传时总会报空指针,奇怪,后来发现原因

  MyBatis 的 @Param 用的 boolean 接参的,如:@Param("vip") boolean vip 需要改成这样即可:@Param("vip") Boolean vip

二、原因解析

  Java 中的布尔类型有两个:基本类型 boolean 和 包装类型 Boolean,用于表示true 或 false。在使用这两种布尔类型时,需要注意,稍有不当,就会产生空指针异常。所以当遇到空指针异常时,需要先看一下有没有布尔类型的参数。

1、Boolean 和 boolean 的区别

  boolean 是基本类型,Boolean 是包装类型

  boolean 取值为true/false,Boolean 取值为true/false/null

  作为属性时,boolean 默认值为 false,Boolean 默认值为 null

2、布尔产生的空指针

// 创建一个Switch 类,定义两种布尔类型的属性
    public class Switch{ 
         private Boolean status;
         private boolean isOn;
        // setters, getters, toString...
    }

// 测试默认值
    @Test
    public void test_default(){ 
        System.out.println(new Switch());
    }
    // 输出Switch{status=null, isOn=false}

3、空指针的情况:boolen赋值为null

  虽然在编译器中,布尔基本类型 boolean 不能直接赋值为null,编译器会提示错误,但是可以间接赋值为 null,当间接赋值为null时,便会抛出空指针异常。

    @Test(expected = NullPointerException.class)
     public void test_null(){ 
         Switch s = new Switch();
         boolean b = s.getStatus();
     }

4、空指针的情况:Boolean作为 if 判断条件

  java 中boolean 类型的变量可以直接作为 if 的判断表达式,但是当Boolean作为判断表单式时,需要保证Boolean非空,否则会抛出空指针异常

    @Test(expected = NullPointerException.class)
     public void test_null(){ 
         Switch s = new Switch();
         // boolean类型可直接作为判断表达式
         if (!s.isOn) { 
             System.out.println("isOne = false");
         }
         // 因为status 是Boolean, 所以编译器不会报错. 若是其它类型, 则编译器会报错
         // 由于status 值为null, 所以会抛出空指针异常
         if (s.getStatus()) { 
             System.out.println();
         }
     }

 

posted @ 2017-10-18 23:41  古兰精  阅读(3184)  评论(0编辑  收藏  举报