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 :
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)
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
.
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!
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.
il est documenté dans les notes de publication.
Le nouveau message ne s'affiche pas par défaut dans la version 1.14:
Une nouvelle option est disponible pour fournir des messages NullPointerException plus utiles:
-xx: + showcodeDeTailSinexceptionMessages
Si l'option est définie, sur la rencontre d'un pointeur nul, le JVM analyse le programme pour déterminer quelle référence était null, puis fournit les détails dans le cadre de nullpointerException.getMessage (). En plus du message d'exception, la méthode, le nom de fichier et le numéro de ligne sont également renvoyés.
Par défaut, cette option est désactivée.
et la proposition complète jep 358 Pour la motivation.
finalement
Ce qui est nouveau dans JDK 15 / a >
La valeur par défaut du drapeau ShowcodeDeTailSinexceptionMessages a été changée en «vrai».
Lorsque le JVM lance un nullpointerException
, il ajoute désormais un message de détail qui spécifie quelle référence était nul.
Cela rend la trace de pile plus facile à interpréter et résout l'ambiguïté si le programme accède à plusieurs références sur la même ligne dans le code source. Par exemple, la ligne
person.name = student.name;
lance un nullpointerException
si personne
ou étudiant
est null , mais avant Java 14, l'exception ne nous a pas dit de laquelle c'était. Maintenant, il le fait:
java.lang.nullpointerException: Impossible de lire le champ "Nom" parce que "Student" est null
Plus d'informations sur ce changement sont disponibles dans jep-358 . / / / p>
Cette question est discutée sur Meta .