JDK 14发布,空指针错误改进正式落地
自 2019 年 9 月 17 日 Java 13 发布之后,Java 新版发布节奏就按照六个月一个新版的传统,新的一个非 LTS (long term support) 版本 Java 14,于 2020 年 3 月 17 日发布。
以下是 Java 14 主要新特性:
- switch 表达式(标准)— JEP 361 
- instanceof 的模式匹配(预览)— JEP 305 
- 有帮助信息的 NullPointerExceptions — JEP 358 
- Record(预览)— JEP 359 
- 文本块(预览2)— JEP 368 
- Package 工具(孵化)— JEP 343 
- G1 的 NUMA 感知内存分配— JEP 345 
- JFR 事件流-JEP 349 
- 非易失性映射字节缓冲区— JEP 352 
- Mac OS 上的 ZGC — JEP 364 
- Windows 上的 ZGC-JEP 365 
- 外部存储器访问API(孵化)— JEP 370 
- 有用的NullPointerExceptions 
Switch 表达式
在最近两个版本(Java 12 和 Java 13)中作为预览功能之后,Switch 表达式 终于在 Java 14 中正式支持了。
Java 12 为 switch 表达式引入了 lambda 语法,从而允许使用多个大小写标签进行模式匹配,并防止出现导致冗长代码的错误。它还强制执行穷尽的 case 检查,如果不涵盖所有 case 可能,将引发编译错误。
Java 13,第二个预览版引入了 yield 语句,而不是使用 break 从表达式返回值。
Java 14 终于让这些特性成为标准。
String result = switch (day) {case "M", "W", "F" -> "MWF";case "T", "TH", "S" -> "TTS";default -> {if(day.isEmpty())yield "Please insert a valid day.";elseyield "Looks like a Sunday.";}};System.out.println(result);
注意:yield 不是 Java 新关键字。它仅用于开关表达式中。
 instanceof 模式匹配(预览功能)
访问任何 Java 开发人员的代码库,你会看到 instanceof 在代码中大量使用。具体来说,instanceof 通常会在条件检查之后进行显式类型转换。
Java 14 通过使条件提取,更加简洁地摆脱了这种冗长的写法。
在 Java 14 之前:
if (obj instanceof Article) {Article a= (Article) obj;System.out.println(a.getAuthor());}
Java 14 及更高版本:
if (obj instanceof Article a) {System.out.println(a.getAuthor());}
在上面的代码中,a 只有 obj 类型为 Article 的实例才会被赋值。变量的范围仅限于条件块。
新的空指针错误信息
空指针异常是任何开发人员的噩梦。直到 Java 13 为止,调试臭名昭著的 NPE 都很棘手。
开发人员必须依靠其他调试工具,或者手动判断各个值是否为空的方法,因为堆栈跟踪只会显示行号。
在 Java 14 之前:
String name = a.getBlog().getAuthor()//StacktraceException in thread "main" java.lang.NullPointerException at NullPointerExample.main(NullPointerExample.java:5)
Java 14 引入了新的 JVM 特性,它的堆栈输出信息更具描述性,如下所示:
Exception in thread "main"java.lang.NullPointerException: Cannot invoke "Blog.getAuthor()" because the return value of "Article.getBlog()" is null at NullPointerExample.main(NullPointerExample.java:4)
注意:以上功能不是语言特性,而是运行时环境的增强。
Record (预览)
Record 是存储数据的类,引入 Record 背后的想法是,快速创建没有八股文的简洁类。
通常,Java 实体类需要实现 equals(),hashCode() 以及一堆 getters 和 setters 方法。尽管某些 IDE 支持这些代码的自动生成,但是代码仍然很冗长。使用 record,只需按照以下方式简单地定义一个类。
record Author(){}//orrecord Author (String name, String topic) {}
Java 编译器将自动生成构造函数,private final 字段,setter/getter,equals / hashCode toString() 等方法。上例自动生成的 getter 方法是 name() 和 topic()。
Record 的语义非常类似 Kotlin 中的数据类。
译者注:更多了解 Record 及其他 JDK 14 特性介绍,可参阅原文:
https://medium.com/better-programming/whats-new-java-14-features-6b5856c94aa4
参考阅读:
高可用架构
改变互联网的构建方式
