36
votes

En quoi NullPointerException dans Java 14 est-il différent de son prédécesseur?

L'une des caractéristiques importantes qui ont été introduites avec Java SE 14 était le utile nullpointerExceptions qui est lié à la convivialité de la nullpointerException . Qu'est-ce qui rend nullpointerException dans java se 14 plus utilisable que son prédécesseur?


3 Réponses :


75
votes

Le JVM lance un nullpointerException au point d'un programme où le code essaie de déréférence d'une référence null . Avec Java SE 14, le nullpointerException offre des informations utiles sur la résiliation prématurée d'un programme. Java SE 14, le JVM décrit la variable (en termes de code source) avec un message null-detail dans le nullpointerException . Il améliore considérablement la compréhension du programme en associant plus clairement une exception dynamique avec le code de programme statique.

Nous pouvons voir la différence avec un exemple.

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)

Sortie avant Java SE 14:

Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:74)

Ce message laisse le programmeur sans aucun doute sur la source de la nullpointerException .

La sortie avec Java SE 14 à l'avance:

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

Le nullpointerException dans Java SE 14 nous indique également quelle référence est null .

Une grande amélioration!


4 commentaires

La «résiliation prématurée» n'est pas pertinente. Les informations sont toujours là si vous les attrapez à la place.


Il est vague et inexact d'impliquer que les exceptions provoquent une "terminaison prématurée du programme". Oui, des exceptions non apprises provoquent la fin du fil le fil , mais cela ne termine le programme que s'il s'agissait du dernier fil non-Daemon vivant. Et même si le programme choisit de se terminer, cela n'implique pas un manque de maturité.


Oh, et objets ne peuvent pas être nuls. Seuls références peuvent l'être.


C'est une bonne réponse et pourrait être complété par l'infor des autres liés aux nouvelles versions Java.