Java switch pattern matching 的 null 分支处理
Java 21 的 switch pattern matching 可以直接按类型分支,但 null 仍然是一个单独的匹配边界:case Object value 不会自动接住空引用。selector 为 null 且没有 case null 时,switch 会抛出 NullPointerException;要处理它,必须显式写出 case null,或者在确实共享兜底策略时使用 case null, default。
官方文档:https://docs.oracle.com/javase/specs/jls/se21/html/jls-14.html
判断口诀:类型模式只负责非 null 对象;null 要单独声明。独立业务写case null,与未知值共用策略才写case null, default,并把合并标签放在最后。
本文要点
- 类型模式不会匹配 null,缺少 null 标签时会抛 NPE。
case null可以与类型模式分开表达空值策略。case null, default只能与 default 合并,且应位于 switch 末尾。
先看清 null 为什么不会命中类型模式
最容易误判的写法是把 Object 当成“所有输入”,然后省略 null 分支。pattern switch 的运行规则会先区分 null 引用;只有非 null 值才继续尝试类型模式。因此下面的 case Object value 能覆盖普通对象,却不能替代 case null。
static String describe(Object value) {
return switch (value) {
// 类型模式只接收非 null 的 Object
case Object object -> "对象:" + object.getClass().getSimpleName();
// 没有 case null 时,value 为 null 会在匹配前抛出 NPE
};
}
这不是 default 是否穷举的问题,而是 null 在模式匹配前就有专门的处理规则。只要 selector 可能为空,就应在设计阶段明确空值是业务状态、缺省值,还是应该直接暴露为异常。

需要独立策略时显式写 case null
如果空值代表“未提供”“尚未加载”或“需要单独提示”,就把它写成独立标签。这样既能保留类型模式的变量,也不会把 null 伪装成一个普通对象。
static String normalize(Object value) {
return switch (value) {
// 空引用是独立业务状态,不访问任何模式变量
case null -> "未提供";
// 只有匹配 String 后,text 才在当前分支内可用
case String text -> "文本:" + text.trim();
// 其他非 null 类型走默认处理
default -> "其他类型:" + value.getClass().getSimpleName();
};
}
这里的顺序也表达了阅读意图:先处理空引用,再处理有明确业务含义的类型,最后由 default 接住剩余非 null 值。case null 不能和 case String text 放在同一个标签里,因为类型模式需要一个可用的非 null 模式变量。
什么时候用 case null, default
当 null 和其他未识别对象确实共享同一套兜底行为时,可以把两个标签合并。它适合“只要不是受支持的 String 就返回通用提示”这类场景,但要注意合并后无法区分到底是 null 还是其他类型。
static String category(Object value) {
return switch (value) {
// 先保留明确的类型分支
case String text -> "文本:" + text;
// null 与未知非 null 对象共享兜底结果
case null, default -> "未分类";
};
}
case null, default 是合法的合并标签,但它不能再与后续标签混用,应放在最后。若后续还想区分数字、日期等类型,应改回独立的 case null 加具体类型模式,再用单独的 default 收尾。

编译前按四个边界检查
| 检查项 | 正确判断 | 常见误区 |
|---|---|---|
| 类型模式 | 只匹配非 null 对象 | 把 Object 模式当成 null 兜底 |
| 空值策略 | 独立写 case null | 试图写 case null, String s |
| 合并兜底 | case null, default 放在末尾 | 后面继续添加 case |
| 模式变量 | 只在匹配成功的分支使用 | 在 null/default 分支引用 String 变量 |
如果 switch 需要返回结果,增强型 switch 表达式或带模式的 switch 语句还必须满足穷举要求。最小可行的工程决策是先列出 null、已知类型和未知类型三类输入,再决定是分别记录、统一兜底,还是让异常尽早暴露。
常见问题
有了 default,为什么 null 仍然抛 NPE?
default 只处理非 null 值中没有命中其他标签的情况。null 要由 case null 或 case null, default 明确覆盖。
case null, default 能放在中间吗?
不能把它当作普通中间分支继续往下写;该合并标签相当于最终兜底,应位于 switch 的末尾。
Java String.translateEscapes 怎样还原转义文本
- 上一篇
- Java String.translateEscapes 怎样还原转义文本
- 下一篇
- Java record compact constructor 的校验位置
-
- 文章 · java教程 | 40分钟前 |
- Java ModuleLayer 动态加载模块的隔离边界
- 112浏览 收藏
-
- 文章 · java教程 | 41分钟前 | Java · Optional · java optional Optional.or
- Java Optional.or 的延迟备用值设计
- 254浏览 收藏
-
- 文章 · java教程 | 43分钟前 |
- Java Pattern named group 怎样避免组号错位
- 158浏览 收藏
-
- 文章 · java教程 | 43分钟前 |
- Java Files.mismatch 比较大文件的返回值
- 159浏览 收藏
-
- 文章 · java教程 | 43分钟前 | 集合 · Stream · java 批处理 Spliterator 并行遍历 trySplit
- Java Spliterator.trySplit 怎样按批次拆分数据源
- 239浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java BigDecimal.stripTrailingZeros 怎样避免科学计数法
- 463浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java Stream gatherer 的状态与短路边界
- 490浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java record compact constructor 的校验位置
- 269浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java String.translateEscapes 怎样还原转义文本
- 340浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java String.split 怎样保留尾部空字符串
- 446浏览 收藏
-
- 文章 · java教程 | 20小时前 | Java · java peek xml StAX XMLEventReader nextEvent
- Java XMLEventReader 的peek与nextEvent有什么区别
- 266浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 821次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 812次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 904次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 874次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 696次使用
-
- Java 时间格式兼容多个输入格式的方法
- 2026-10-18 501浏览
-
- Java try-with-resources 多个资源关闭顺序是什么
- 2026-09-10 501浏览
-
- 矩阵主副对角线快速定位技巧
- 2026-05-31 501浏览
-
- Java多态优化流程代码与行为分发改进
- 2026-05-26 501浏览
-
- JVM 类元数据双亲委派链表深度解析
- 2026-05-21 501浏览

