vlambda博客
学习文章列表

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."; else yield "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()//Stacktrace Exception 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


参考阅读:




高可用架构

改变互联网的构建方式