一.什么是空指针异常?
空指针异常(NullPointerException)是程序运行中因访问未初始化或已被置为null
的对象而触发的错误
二.出现空指针的情况
1. 对象未初始化或意外置空
- 声明但未实例化:例如直接使用未初始化的对象调用方法或访问属性:
- 显式赋值为
null
:在代码中手动将对象引用设为null
后继续使用,例如:
2. 方法返回值未判空
- 方法返回
null
未处理:例如调用API接口或第三方库时,未检查返回值是否为null
: - 集合操作中的空值:访问
Map
或List
时,若键不存在或索引越界可能返回null
:
3. 多线程环境下的共享资源问题
- 线程间共享对象状态不一致:若一个线程将对象置为
null
,另一线程未同步访问会导致异常 - 异步回调中的空指针:例如网络请求回调时,若主线程已销毁
Activity
而回调仍在处理数据,可能触发空指针。
4. 自动拆箱操作
- 包装类对象为
null
时拆箱:例如Integer
对象为null
时尝试转为基本类型int
:
5. 特定框架或开发场景的常见问题
- Android开发中的典型场景:
findViewById
返回null
(布局文件未正确绑定或视图ID错误)。Fragment
中getActivity()
返回null
(Fragment
未附加到Activity
时调用)。
- 反射操作错误:通过反射获取对象失败后未判空,直接调用方法。
6. 外部资源引用问题
- 文件或数据库连接未正确初始化:例如未检查文件是否存在或数据库连接是否成功建立。
- 动态加载资源失败:如解析损坏的XML/JSON文件导致对象未正确初始化。
7. 编码逻辑缺陷
- 未考虑递归终止条件:递归调用中未正确初始化对象,导致无限递归后资源耗尽。
- 参数传递错误:方法接收
null
参数且未进行空检查,例如:
三.如何避免空指针异常?
- 强制判空:在访问对象前使用
if (obj != null)
检查。 - 使用
Optional
类:Java 8及以上版本可用Optional
封装可能为null
的值。 - 静态代码分析工具:如SpotBugs、Checkstyle等检测潜在问题。
- 单元测试覆盖:针对边界条件(如
null
输入)编写测试用例。