Java 13在2019年9月发布,这个版本引入的正式可用特性几乎没有,是我认为最无聊的版本之一。所以我们跳过Java 13直接来看Java 14吧。

Switch表达式

我觉得switch表达式在日常中开发被使用的太少了,不是因为这个关键字和if比起来太“难”,而是因为它很冗长,而且这种视觉上的噪声容易掩盖那些难以调试的错误,特别是那些break语句,就像下面这样:

switch (day) {case MONDAY:case FRIDAY:case SUNDAY:System.out.println(6);break;case TUESDAY:System.out.println(7);break;case THURSDAY:case SATURDAY:System.out.println(8);break;case WEDNESDAY:System.out.println(9);break;default:System.out.println(11);
}

一点也不清晰,所以我写Java时通常拒绝使用switch表达式。

新的switch标签

为了简化switch,Java在引入了 switch标签case L ->这样一个特性,如果输入匹配L,则仅执行标签右侧的代码。我们还建议每个 case 允许多个常量,用逗号,分隔。之前的代码现在可以写成:

switch (day) {case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);case TUESDAY                -> System.out.println(7);case THURSDAY, SATURDAY     -> System.out.println(8);case WEDNESDAY              -> System.out.println(9);default                     -> System.out.println(11);
}

case L ->switch标签右侧的代码被限制为表达式、代码块或throw语句。如果我们希望Switch语句有返回值可以这样写:

int numLetters = switch (day) {case MONDAY, FRIDAY, SUNDAY -> 6;case TUESDAY                -> 7;case THURSDAY, SATURDAY     -> 8;case WEDNESDAY              -> 9;default                     -> 11;
};

当Switch语句赋值给变量时default分支是必须的。

如果您正在学习Spring Cloud,推荐一个经典教程(含Spring Cloud Alibaba):https://blog.didispace.com/spring-cloud-learning/

yield 受限标识符

case L ->右边是一个代码块而且根据case条件会产生一个值的情况下,根据我们的思维惯性会这样写:

int numLetters = switch (day) {case WEDNESDAY              -> {System.out.println("day = " + day);// 错误的写法,会引发编译错误return 9;};default -> 11;};

你会发现上面的写法通不过编译,这是语境问题,当满足case条件时并不是返回(return)一个值的意思,而是产生(yield)了一个值。所以引入了一个新的受限标识符yield注意不是关键字)来处理这个语境问题。

int numLetters = switch (day) {case WEDNESDAY              -> {System.out.println("day = " + day);// yield 才是正确的yield 9;};default -> 11;};

更合理的空指针提示

空指针异常是Java最常见的异常之一,在Java 14之前的空指针异常堆栈信息中只是提示给定行的发生了NullPointerException,不够直观清晰:

Exception in thread "main" java.lang.NullPointerException
at cn.felord.SomeClass.main(SomeClass.java:17)

现在日志会说明空指针的具体来源:

Exception in thread "main" java.lang.NullPointerException: Cannot store to int array because "arr" is null
at cn.felord.SomeClass.main(SomeClass.java:17)

我们可以明确地知道arrnull导致了空指针。

最近有小伙伴吐槽 2021.3 升级后不能无限试用了,正好看到一个方法,大家可以关注公众号 TJ君,回复IDEA2021.3,试试看吧

其它的一些变更

由于一些预览特性并没有转正,甚至在未来可能移除,所以这里不再进行详细的说明。感兴趣的可以到Java 14发行日志[1]页面查看。多多关注,点赞,转发,评论,后续为大家带来更多有价值的内容输出。

参考资料

[1]Java 14发行日志: https://openjdk.java.net/projects/jdk/14/

往期推荐

Java 9 - 17 特性解读:Java 12

Java 9 - 17 特性解读:Java 11

Java 9 - 17 特性解读:Java 10

Java 9 - 17 特性解读:Java 9

推荐关注本文作者:码农小胖哥

分享高质量编程知识,探讨IT人生

技术干货,实战技巧,面试技巧,前沿资讯一个都不能少

Java 9 - 17 特性解读:​Java 13相关推荐

  1. Java 9 - 17 特性解读:Java 11

    Java 11是自Java 8以来的又一个LTS版本,是目前全球使用最多的LTS版本之一.今天我们接着在Java 9 到 Java 17系列文章中来认识针对普通开发者的Java 11. 字符串API增 ...

  2. Java 9 - 17 特性解读:Java 10

    在上一篇我们对Java 9的特性进行了一些回顾,今天接着来看看Java 10带来了什么特性.之所以需要把Java 8 到Java 17的特性归纳一遍,因为Java社区对Java 17的重视程度前所未有 ...

  3. Java 9 - 17 特性解读:Java 9

    Java 17 是Java 最重要的一个LTS版本之一,但是直接从Java 8 过渡到Java 17跨度太大了,势必有些困难.所以胖哥抽时间梳理了一下从Java 9到Java 17的一些常用API的变 ...

  4. 【Java 8 新特性】Java Stream 通过skip()方法跳过前N个子元素

    [Java 8 新特性]Java Stream 通过skip方法跳过前N个子元素 1.skip() 示例 2.skip() vs limit() 参考文献 本页将介绍 Stream.skip方法示例. ...

  5. 全网最全的JAVA所有版本特性【JAVA 1.0 - JAVA 20】

    闲来想了解下各版本之间的特性,搜索没有最新的特性说明,故想写一份.废话不多说. PS:绝对全网最全最齐,若不是,请私聊我补充,哈哈哈哈! JDK Version 1.0 1996-01-23 Oak( ...

  6. [转]【JAVA各版本特性】JAVA 1.0

    闲来想了解下各版本之间的特性,搜索没有最新的特性说明,故想写一份.废话不多说. JDK Version 1.0 1996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用 ...

  7. IntelliJ IDEA 使用 Java 11新特性以及Java 8 以来的Java 11新特性介绍

    文章目录 Java 11 安装 IDEA 设置 特性1:lambda表达式中允许使用var 特性2: String新增REPEAT 方法,方便拷贝字符串 特性3: 文件读写更方便:readString ...

  8. 【Java 8 新特性】Java Clock 详解

    Java Clock 详解 systemDefaultZone millis instant offset system systemUTC tick tickMillis tickSeconds t ...

  9. 【Java 8 新特性】Java Stream.of()用法示例

    本页将介绍Java Stream.of方法示例.Stream.of用于为给定元素创建顺序流.我们可以传递单个元素或多个元素. 查看javadoc中Stream.of方法声明. static <T ...

最新文章

  1. php连接mssql的一些方法总结
  2. c++游戏代码坦克大作战_一红一蓝多种模式的双人小游戏:红蓝大作战
  3. 中国速度之二神山建设(3):有力的技术保障,基建世界里的云原生缩影 | IDCF DevOps案例研究...
  4. 关于tornado的异步耗时操作假设
  5. [VMM 2008虚拟化之初体验-1] 准备环境
  6. vue ---- webpack扩展
  7. Tideways+Xhgui搭建非侵入式php监控平台
  8. 多个onload事件写法
  9. javascript DOM操作
  10. c语言课程设计物业,C语言课程设计报告--物业管理系统.doc
  11. 冷高轮时间王思聪吃热狗电脑屏幕保护下载
  12. 商务统计_5 用图表演示数据 - 茎叶图
  13. 什么是软件质量?试叙述它与软件可靠性的关系。
  14. Oracle进阶(六)包(Package)和包体
  15. 3d视觉效果html,jQuery炫酷网页3D背景视觉差特效
  16. 从少量访问日志还原黑客攻击过程
  17. Failed to download https://chrome-infra-packages.appspot.com/dl/flutter/web/canvaskit_bundle 超时 解决办法
  18. windows msys2 启动缓慢 解决办法
  19. YOLOV4+DeepSort车流量检测基础版
  20. Andriod开发 GridView

热门文章

  1. strlen与sizeof区别
  2. Canvas 渐变 图像组合效果 颜色翻转
  3. WCF的三个名称/命名空间,你是否傻傻分不清楚?
  4. 亲试虚拟机为REDHAT5装VM-tool
  5. 两表(多表)关联update的写法 .
  6. linux find 忽略大小写查找文件
  7. linux 安装分区设置分区大小
  8. linux c brotli压缩简介
  9. linux内核 task_struct 中自旋锁的应用
  10. linux gdb调试问题汇总