浅析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();
}
}