0

0

什么是Java的增强型switch表达式_Java 14+中的yield关键字用法

P粉602998670

P粉602998670

发布时间:2026-02-15 13:47:37

|

202人浏览过

|

来源于php中文网

原创

增强型switch是表达式,必须产出值,故不能用return而需yield;yield专用于提供分支结果,须显式写出且每分支仅一个;混用break会编译错误;仅java 15+支持,低版本运行会抛verifyerror。

什么是java的增强型switch表达式_java 14+中的yield关键字用法

Java增强型switch为什么不能直接return

因为增强型switch是表达式,不是语句——它必须产出一个值,而return会提前退出方法,破坏表达式求值流程。你写return "A"case里,编译器直接报错:error: yield or throw expected

常见错误现象:把老式switch的写法照搬过来,比如:

String result = switch (day) {
    case MON -> return "Monday"; // ❌ 编译失败
    default -> "Unknown";
};

正确做法是用yield向switch表达式“交出”当前分支的值:

  • yield只在switch表达式内部有效,作用是“提供本case的计算结果”
  • 每个case分支必须有且仅有一个yield(或throw),不能漏,也不能多
  • 如果分支逻辑复杂,要用大括号包裹,并在末尾显式写yield

yield和break在switch表达式里能混用吗

不能。break属于老式switch语句,而yield专为switch表达式设计。混用会导致编译错误:error: break cannot be used in a switch expression

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

使用场景差异很关键:

  • 想赋值给变量、作为方法返回值、传给函数参数 → 用switch表达式 + yield
  • 只想执行副作用(比如打日志、改状态)不产出值 → 用传统switch语句 + break

参数差异也明显:switch表达式要求所有分支必须覆盖(或有default),否则编译不过;而老式switch没这限制。

Pixlr Remove BG
Pixlr Remove BG

几秒钟删除图片背景

下载

switch表达式里写多行逻辑怎么加yield

必须用大括号把分支包起来,然后在最后一行写yield。光靠缩进或换行没用,Java不认。

容易踩的坑:以为写了几行代码,最后没yield也能自动返回最后一行的值——不会。编译器会报:error: missing yield statement

示例:

String desc = switch (status) {
    case ACTIVE -> "在线";
    case INACTIVE -> {
        System.out.println("用户已停用");
        yield "离线"; // ✅ 必须显式yield
    }
    default -> throw new IllegalStateException("未知状态: " + status);
};

性能影响几乎为零:JVM对switch表达式做了优化,生成的字节码和精心写的if-else相当,甚至更好;但可读性提升明显。

Java 14+用了yield,低版本能运行吗

不能。yield是Java 14预览特性,Java 15正式引入,但前提是编译和运行都用≥15的JDK。哪怕你用JDK 21编译成class文件,放到JDK 11上运行,照样抛java.lang.VerifyError: Bad type on operand stack

兼容性要点:

  • 源码级兼容:必须用--enable-preview(Java 14/15)或直接用Java 15+(无需预览)
  • 字节码级不兼容:含yield的class文件无法被Java 14及以下加载
  • 别指望用Lombok或其他注解处理器“转译”,目前没有稳定可靠的编译期降级方案

最常被忽略的一点:CI/CD流水线里JDK版本和本地开发不一致时,yield会悄无声息地让构建失败,错误信息还藏在编译日志深处。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

814

2023.08.22

switch语句用法
switch语句用法

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

558

2023.09.21

Java switch的用法
Java switch的用法

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

435

2024.03.13

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

351

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

339

2023.10.25

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

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

120

2025.10.15

java break和continue
java break和continue

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

259

2025.10.24

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

624

2024.01.03

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

283

2026.02.13

热门下载

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

精品课程

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

共23课时 | 3.6万人学习

C# 教程
C# 教程

共94课时 | 9.6万人学习

Java 教程
Java 教程

共578课时 | 66.7万人学习

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

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