0

0

如何使用Java的switch语句_JDK 12+增强开关表达式用法

P粉602998670

P粉602998670

发布时间:2026-03-09 13:04:02

|

185人浏览过

|

来源于php中文网

原创

jdk 12+ switch 表达式必须显式返回值,所有分支需覆盖(含default),用yield而非break;字符串switch性能较差且区分大小写;jdk 17+模式匹配需启用预览功能。

如何使用java的switch语句_jdk 12+增强开关表达式用法

switch 表达式返回值必须显式处理

JDK 12+ 的 switch 支持表达式写法(带 -> 箭头),但它不再是语句,而是表达式——这意味着它必须有明确的返回值,且所有分支都要覆盖,不能漏掉 default 或遗漏枚举常量。

常见错误现象:Incompatible types: bad type in switch expression 或编译失败提示 “missing return statement”。

  • 如果 switch 用在赋值或方法返回处,每个分支末尾不能用 break,得用表达式(如字面量、方法调用)或 { ... yield value; }
  • 枚举类型做 switch 时,即使你“确定”只会有几个值,JDK 仍要求显式列出全部或加 default;否则编译报错
  • 使用 yield 时,它只能出现在 -> { ... } 块内,不能单独和箭头同行(case A -> yield "x" 是非法的)
String result = switch (day) {
    case MON, TUE, WED -> "weekday";
    case THU -> { yield "almost weekend"; }
    case FRI -> "yes";
    default -> "unknown";
};

字符串 switch 在 JDK 7+ 支持,但性能不如枚举或 int

虽然 switch 支持 String 从 JDK 7 就开始,但底层是编译器生成的哈希查找 + equals 回退逻辑,不是跳转表。实际性能比 int 或枚举慢,尤其分支多时。

  • 不要在高频循环里对长字符串做 switch,考虑预转换成枚举或 Map 查表
  • null 输入会直接抛 NullPointerException,不进任何 case;需要提前判空
  • 字符串比较是区分大小写的,"A""a" 是不同分支,不会自动归一化

yield 和 break 在 switch 表达式中不能混用

这是最容易混淆的点:老式 switch 语句用 break 防止穿透,新式表达式用 yield 返回值。两者语法层级不同,强行混用会导致编译错误。

面多多
面多多

面试鸭推出的AI面试训练平台

下载

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

  • case X -> break; 是非法的——箭头右边必须是表达式或带 yield 的块
  • case X: yield "a"; break; 也是错的——yield 已经结束该分支,后面语句不可达
  • 想执行多行逻辑再返回?必须用 { ... yield value; },且 yield 是唯一出口
int code = switch (status) {
    case "OK" -> 200;
    case "NOT_FOUND" -> {
        log.warn("404 hit");
        yield 404;
    }
    default -> -1;
};

模式匹配(JDK 17+)让 switch 能解构对象,但需开启预览

如果你用的是 JDK 17 或更新版本,并启用了预览功能,switch 可以直接匹配类型并解构,比如 case Point(int x, int y)。但这不是默认开启的。

  • 编译要加 --enable-preview --source 17(或对应版本),运行也要加 --enable-preview
  • 模式匹配分支必须穷尽,比如 case nullcase String s 之间若漏了其他引用类型,可能编译失败
  • 目前不支持在同一个 switch 中混用传统 case 和模式 case(如 case 1:case String s:),会报错

真要用,先确认 JDK 版本、预览开关、以及目标类型是否支持模式(比如 record、sealed class 更友好)。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

990

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

253

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1564

2023.10.24

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

569

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

441

2024.03.13

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

120

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

261

2025.10.24

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

59

2026.03.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.3万人学习

C# 教程
C# 教程

共94课时 | 11万人学习

Java 教程
Java 教程

共578课时 | 79.4万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号