浅析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();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律