java - Java 14中的NullPointerException与之前的版本有何不同?

标签 java nullpointerexception java-14 java-15

Java SE 14引入的重要功能之一是 Helpful NullPointerExceptions ,它与NullPointerException的可用性有关。是什么使Java SE 14中的NullPointerException比其前身更有用?

最佳答案

JVM在程序试图取消引用NullPointerException引用的位置上抛出null。在Java SE 14中,NullPointerException提供了有关程序过早终止的有用信息。从Java SE 14开始,JVM在NullPointerException中用空细节消息描述了变量(根据源代码)。通过更清楚地将动态异常与静态程序代码相关联,它大大提高了对程序的理解。
让我们用一个例子看一下区别。

import java.util.ArrayList;
import java.util.List;

class Price {
    double basePrice;
    double tax;

    public Price() {
    }

    public Price(double basePrice) {
        this.basePrice = basePrice;
    }

    public Price(double basePrice, double tax) {
        this.basePrice = basePrice;
        this.tax = tax;
    }
    // ...
}

class Product {
    String name;
    Price price;

    public Product() {
    }

    public Product(String name, Price price) {
        this.name = name;
        this.price = price;
    }
    // ...
}

class CartEntry {
    Product product;
    int quantity;

    public CartEntry() {
    }

    public CartEntry(Product product, int quantity) {
        this.product = product;
        this.quantity = quantity;
    }

    // ...
}

class Cart {
    String id;
    List<CartEntry> cartEntries;

    public Cart() {
        cartEntries = new ArrayList<>();
    }

    public Cart(String id) {
        this();
        this.id = id;
    }

    void addToCart(CartEntry entry) {
        cartEntries.add(entry);
    }
    // ...
}

public class Main {
    public static void main(String[] args) {
        Cart cart = new Cart("XYZ123");
        cart.addToCart(new CartEntry());
        System.out.println(cart.cartEntries.get(0).product.price.basePrice);
    }
}
Java SE 14之前的输出:
Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:74)
该消息使程序员对NullPointerException的来源一无所知。
从Java SE 14开始的输出:
Exception in thread "main" java.lang.NullPointerException: Cannot read field "price" because "java.util.List.get(int).product" is null
    at Main.main(Main.java:74)
Java SE 14中的NullPointerException还告诉哪个引用是null
很大的进步!

关于java - Java 14中的NullPointerException与之前的版本有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65659746/

相关文章:

java - TestNG - 工厂和数据提供者

java - 如何编码实时音频?

java - 为什么我的对象保持为空?

java.lang.UnsupportedOperationException : This feature requires ASM8_EXPERIMENTAL 异常

java - javaagent jar 在 bootclasspath 中的位置

java - EL 如何检索请求参数值?

java - 为什么我的编译器在不应该出现 NullPointerException 的情况下出现?

java - 在 Java 中,如果一个空指针很少发生,那么使用 catch 而不是 if 会更好吗?

java - 如何设置使用--enable-preview从gradle编译并运行标志?

java - 在 maven 生命周期中运行 JUnit5 和 Spock