讲师中心 微信公众号
AI工具推荐 视频效率加速

java出现空指针的情况 盘点引发NullPointerException的六大典型场景

陌瑶姑娘_7674

陌瑶姑娘_7674

发布时间:2026-02-03 14:14:39

|

894人浏览过

|

来源于php中文网

原创

NPE根源是假设引用非空但实际为null,需在设计阶段明确空值契约。常见场景含调用前未判空、自动拆箱、集合元素为null、静态方法误用实例调用、构造器泄露this、多线程共享状态未同步。

java出现空指针的情况 盘点引发nullpointerexception的六大典型场景

调用对象方法前未判空

只要对象引用为 null,直接调用其任何实例方法(包括 toString()、equals()、hashCode())都会触发 NullPointerException。尤其容易在日志打印、参数校验、DTO 转 VO 等环节忽略。

  • 常见写法:user.getName().length() —— 若 user 为 null,立刻崩溃
  • 安全写法:先用 Objects.nonNull(user) 或 user != null 判空,再访问;或改用 Optional.ofNullable(user).map(User::getName).orElse("")
  • 注意:String.valueOf(obj) 和 Objects.toString(obj) 可安全处理 null,但它们不解决业务逻辑中对非空的依赖

自动拆箱时包装类为null

Java 在执行 int、boolean 等基本类型运算时,会自动将 Integer、Boolean 等包装类拆箱。若该包装类变量本身是 null,就会抛出 NullPointerException,而非 NumberFormatException 或其他异常。

  • 典型场景:Integer status = getStatusFromDB(); if (status == 1) { ... } —— 若 getStatusFromDB() 返回 null,比较时触发 NPE
  • 避免方式:改用 Objects.equals(status, 1),或显式判空 status != null && status == 1
  • 注意:三元表达式如 status != null ? status : 0 是安全的;但 status ?: 0(Kotlin 风格)在 Java 中不合法

集合或数组元素为null后直接使用

List、Map、数组本身不为 null,不代表其中元素也不为 null。取值后未检查就调用方法或参与计算,是高频 NPE 来源。

  • 例如:list.get(0).trim() —— list 不空,但第 0 个元素可能是 null
  • map.get("key").length() —— map 存在,但 key 对应 value 为 null
  • 建议:用 Optional.ofNullable(list.get(0)).map(String::trim).orElse("");或提前过滤掉 null 元素(如 list.stream().filter(Objects::nonNull).collect(...))
  • 特别注意:MyBatis 查询结果映射到 List 时,若数据库字段允许 NULL,对应字段可能被设为 null,而非默认值

静态方法误当成实例方法调用

当把本该通过类名调用的静态方法(如 StringUtils.isEmpty(str)),错误地通过一个可能为 null 的对象引用去调用(如 strUtils.isEmpty(str)),而 strUtils 恰好是 null,就会触发 NPE。

java-api-doc-generator
java-api-doc-generator

分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。

下载

立即学习“Java免费学习笔记(深入)”;

  • 本质是「调用空引用的任意方法」,和是否静态无关;JVM 不关心语义,只看接收者是否为 null
  • 排查重点:IDE 中 Ctrl+Click 进入方法签名,确认是 static;调用处是否用了实例变量而非类名
  • 更隐蔽的情况:Lombok 的 @UtilityClass 生成的类,所有方法都是 static,但开发者可能误以为它是普通工具类实例

构造函数中过早暴露 this 引用

在构造器执行完成前,就把 this 发送给其他线程或注册到监听器、缓存、单例容器中,此时对象字段尚未初始化完毕,外部代码拿到该引用并调用其方法,极易因字段为 null 报 NPE。

  • 典型模式:new Task().registerToScheduler(this) —— 构造器里调用了外部方法,并传入 this
  • Spring 中常见于 @PostConstruct 未生效前就发布事件,或在构造器中调用 ApplicationContext.publishEvent()
  • 根本规避方式:禁止在构造器中泄露 this;改用工厂方法 + 初始化回调,或延迟注册到 Bean 生命周期后期(如 afterPropertiesSet)

异步/多线程环境下共享对象状态未同步

多个线程共用一个对象,某个线程将字段设为 null,另一线程未加锁就直接访问该字段,可能读到 null 并调用其方法 —— 表现为偶发 NPE,难以复现。

  • 例子:private Cache cache; 被两个线程同时读写,线程 A 执行 cache = null,线程 B 同时执行 cache.get(key)
  • 不是简单加 synchronized 就能解决:要确保「赋值」和「使用」都在同一锁保护下,且锁对象一致
  • 更稳妥做法:用 volatile 修饰引用(仅保证可见性,不保证原子性);或改用线程安全容器如 ConcurrentHashMap;或彻底避免共享可变状态
  • 注意:Spring 默认 singleton Bean 是多线程共享的,字段若可变,必须自行保证线程安全
NPE 的根源永远是「假设了某个引用非空,但实际它就是 null」。比起堆栈上找哪一行崩了,更关键的是在设计阶段明确每个变量的空值契约:它是否允许为 null?谁负责初始化?谁负责校验?这些约定一旦模糊,再好的 try-catch 也盖不住漏掉的空检查。

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

371

2026.02.12

Java Kotlin协程与异步编程实战
Java Kotlin协程与异步编程实战

本专题围绕 Kotlin 协程与异步编程展开,讲解挂起函数、协程作用域、异步任务调度及并发控制方法。通过实际项目案例,帮助开发者提升后端服务性能,实现高效异步任务处理与稳定性保障。

179

2026.04.13

Kotlin Android开发教程大全
Kotlin Android开发教程大全

系统讲解 Google 官方推荐的 Android 开发首选语言 Kotlin 的核心知识与工程实践,涵盖 Kotlin 简洁语法(空安全/数据类/扩展函数/解构声明/作用域函数)与 Java 互操作、集合操作与函数式编程、协程(Coroutines)异步编程(suspend/launch/async/Flow)、Jetpack Compose 声明式 UI 开发(状态管理/组合函数/导航/动画)、MVVM / MVI 架构设计与 Vi

268

2026.06.03

spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2711

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

497

2026.01.26

mybatis一级缓存和二级缓存
mybatis一级缓存和二级缓存

在MyBatis中,一级缓存和二级缓存是两种不同级别的缓存机制,它们都可以用来提高性能。本专题提供mybatis一级缓存和二级缓存相关文章,大家可以免费阅读。

583

2023.08.21

ibatis和mybatis有什么区别
ibatis和mybatis有什么区别

ibatis和mybatis的区别:1、基本信息不同;2、开发时间不同;3、功能与易用性;4、配置文件;5、入参类型与出参类型;6、返回结果集接受方式;7、语法差异;8、数据库方言支持;9、插件支持;10、社区活跃度;11、全球化支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2762

2024.02.23

mybatis如何配置数据库连接
mybatis如何配置数据库连接

mybatis配置数据库连接的方法:1、指定数据源;2、配置事务管理器;3、配置类型处理器和映射器;4、使用环境元素;5、配置别名。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

446

2024.02.23

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

20

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn