Java13从Java9到Java17于2019年9月发布。这个版本几乎没有引入任何官方可用的功能,是我认为最无聊的版本之一。所以我们跳过Java13,直接进入Java14。switch表达式我觉得switch表达式在日常开发中用的太少了,不是因为这个关键字和if相比太“难”了,而是因为它非常冗长,而且这种视觉噪音倾向于掩盖那些难以调试的错误,尤其是像这样的break语句:switch(day){caseMONDAY:caseFRIDAY:caseSUNDAY:System.out.println(6);break;caseTUESDAY:System.out.println(7);break;caseTHURSDAY:caseSATURDAY:System.out.println(8);break;caseWEDNESDAY:System.out.println(9);break;default:System.out.println(11);}一点都不清楚,所以我写Java时使用switch表达式一般是被拒绝的。新的switch标签为了简化switch,Java引入了switch标签caseL->这样的预览功能,如果输入匹配L,则只会执行标签右侧的代码。我们还建议每个案例允许多个常量,以逗号分隔。之前的代码现在可以写成:switch(day){caseMONDAY,FRIDAY,SUNDAY->System.out.println(6);caseTUESDAY->System.out.println(7);caseTHURSDAY,SATURDAY->System.out.println(8);caseWEDNESDAY->System.out.println(9);default->System.out.println(11);}caseL->开关标签右边的代码限制为表达式,代码块或抛出语句。如果我们想让Switch语句有返回值,可以这样写:intnumLetters=switch(day){caseMONDAY,FRIDAY,SUNDAY->6;caseTUESDAY->7;caseTHURSDAY,SATURDAY->8;caseWEDNESDAY->9;默认->11;};将Switch语句分配给变量时需要默认分支。yieldRestrictedidentifiercaseL->如果右边是代码块,会根据case条件生成一个值,按照我们的思维惯性,会这样写:intnumLetters=switch(day){caseWEDNESDAY->{系统.out。println("day="+day);//不正确的写法会导致编译错误return9;};default->11;};你会发现上面的写法无法通过编译,这是一个上下文问题,当case满足条件时,并不是说返回(return)一个值,而是生成(yield)一个值。所以引入了一个新的受限标识符yield(注意不是关键字)来处理这个上下文问题。intnumLetters=switch(day){caseWEDNESDAY->{System.out.println("day="+day);//yield是正确的yield9;};default->11;};更合理的空指针提示空指针异常是Java中最常见的异常之一。在Java14之前的空指针异常的堆栈信息中,仅仅表示某行发生了NullPointerException,不够直观:Exceptioninthread"main"java.lang.NullPointerExceptionatcn.felord.SomeClass。main(SomeClass.java:17)现在日志会解释空指针的具体来源:Exceptioninthread"main"java.lang.NullPointerException:Cannotstoretointarraybecause"arr"isnullatcn.felord.SomeClass.main(SomeClass.java:17)we可以清楚的知道arr为null导致空指针。对于其他的一些改动,一些预览功能还没有实现,甚至未来可能会被移除,这里就不做详细描述了。有兴趣的可以去Java14发布日志[1]页面查看。多多关注、点赞、转发、评论、关注,将为您带来更多有价值的内容输出。参考资料[1]Java14发布日志:https://openjdk.java.net/projects/jdk/14/
