Java 14 中的 NullPointerException 与其前身有何不同?
2022-09-01 05:31:47
Java SE 14 引入的重要功能之一是有用的 NullPointerExceptions,它与 .是什么让Java SE 14比它的前身更有用?NullPointerException
NullPointerException
Java SE 14 引入的重要功能之一是有用的 NullPointerExceptions,它与 .是什么让Java SE 14比它的前身更有用?NullPointerException
NullPointerException
JVM 在程序中代码尝试取消引用的位置抛出 a。在 Java SE 14 中,它提供了有关程序过早终止的有用信息。从 Java SE 14 开始,JVM 在 .它通过更清楚地将动态异常与静态程序代码相关联,极大地提高了对程序的理解。NullPointerException
null
NullPointerException
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);
}
}
Exception in thread "main" java.lang.NullPointerException
at Main.main(Main.java:74)
此消息使程序员对 .NullPointerException
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
一个很大的改进!
它记录在发行说明中。
默认情况下,在版本 1.14 中不显示新消息:
可以使用一个新选项来提供更有用的 NullPointerException 消息:
-XX:+显示代码详细信息在异常消息
如果设置了该选项,则在遇到空指针时,JVM 会分析程序以确定哪个引用为 null,然后将详细信息作为 NullPointerException.getMessage() 的一部分提供。除了异常消息之外,还会返回方法、文件名和行号。
默认情况下,此选项处于禁用状态。
以及完整的提案JEP 358作为动机。
最终
标志 ShowCodeDetailsInExceptionMessages 的默认值已更改为“true”。