zoukankan      html  css  js  c++  java
  • Java14

    https://mp.weixin.qq.com/s/WjTz1-jSIeFd4c06NewxPg

    JDK14特性一览:

    JEP 305: Pattern Matching for instanceof (Preview)
    JEP 358: Helpful NullPointerExceptions
    JEP 361: Switch Expressions (Standard)
    JEP 345: NUMA-Aware Memory Allocation for G1
    JEP 349: JFR Event Streaming
    JEP 366: Deprecate the ParallelScavenge + SerialOld GC Combination
    JEP 363: Remove the CMS Garbage Collector
    JEP 364: ZGC on macOS
    JEP 368: Text Blocks (Second Preview)

    JEP 358: Helpful NullPointerExceptions

    https://mp.weixin.qq.com/s/zJRZpUPURSR2ankd2aRCjQ

    举个简单的例子,就比如下面的代码,要找到公司某个员工的户籍所在地,我们这样来调用

    String city = employee.getDetailInfos().getRegistryAddress().getCity();
    在链式调用的过程中,如果employeegetDetailInfos(),或者 getRegistryAddress() 为空,JVM就会抛出 NullPointerException

    那么导致异常的根本原因是什么?如果不使用调试器,很难确定哪个变量为空。而且,JVM也只会打印导致异常的方法、文件名和行号,仅此而已。那么下面,我将带大家了解Java 14如何通过 JEP 358 解决这个问题。

    JEP 358 旨在通过描述某个变量是 “null” 来提高 JVM 生成的 “NullPointerException” 的可读性。JEP 358通过在方法、文件名和行号旁边描述为 null 的变量,带来了一个详细的 NullPointerException 消息。它通过分析程序的字节码指令来工作。因此,它能够精确地确定哪个变量或表达式是null。最重要的是,JDK 14中默认关闭详细的异常消息。要启用它,我们需要使用命令行选项:

    -XX:+ShowCodeDetailsInExceptionMessages

    首先,只有当JVM本身抛出一个 NullPointerException 时,才会进行详细的消息计算,如果我们在Java代码中显式抛出异常,则不会执行计算。原因是因为:在这些情况下,很可能已经在异常构造函数中传递了一条有意义的消息。

    其次,**JEP 358 ** 懒汉式地计算消息,这意味着只有当我们打印异常消息时才调用增强的NullPointerException,而不是当异常发生时就调用。因此,对于通常的JVM流程不应该有任何性能影响,在那里我们可以捕获并重新抛出异常,因为咱并不会只想打印异常消息。

    最后,详细的异常消息可能包含源代码中的局部变量名。因此,我们可以认为这是一个潜在的安全风险。但是,只有在运行使用激活的 -g 标记编译的代码时,才会发生这种情况,该标记会生成调试信息并将其添加到类文件中。

     

    JEP 361: Switch Expressions (Standard)

     这个特性也是继承自JDK13的JEP 354: Switch Expressions (Preview),有一段switch老语法代码如下:

    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;
    }

    这段代码显得有点冗余,新的语法代码如下,很明显简练很多:

    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);
    }

    而且,新的switch语法能直接将其作为表达式,用法如下:

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

     

     

     

     
  • 相关阅读:
    Socket通信
    浏览器调用打印机
    python dict操作
    python list操作
    python 模块Example链接
    python random模块
    python configparser模块
    python unittest模块
    python timeit模块
    python datetime模块
  • 原文地址:https://www.cnblogs.com/dingpeng9055/p/12848815.html
Copyright © 2011-2022 走看看