Handige NullPointerExceptions in Java 14

1. Overzicht

In deze tutorial gaan we verder met onze serie over Java 14 door naar Helpful te kijken NullPointerExceptions, wat een nieuwe functie is die in deze versie van de JDK is geïntroduceerd.

2. Traditioneel NullPointerExceptions

In de praktijk zien of schrijven we vaak code die methoden in Java aaneenschakelt. Maar wanneer deze code een NullPointerException, kan het moeilijk worden om te weten waar de uitzondering vandaan komt.

Stel dat we het e-mailadres van een medewerker willen weten:

String emailAddress = employee.getPersonalDetails (). GetEmailAddress (). ToLowerCase ();

Als het werknemer voorwerp, getPersonalDetails () of getEmailAddress () is nul, de JVM gooit een NullPointerException:

Uitzondering in thread "main" java.lang.NullPointerException op com.baeldung.java14.npe.HelpfulNullPointerException.main (HelpfulNullPointerException.java:10)

Wat is de hoofdoorzaak van de uitzondering? Het is moeilijk om te bepalen welke variabele dat is nul zonder een debugger te gebruiken. Bovendien drukt de JVM alleen de methode, de bestandsnaam en het regelnummer af die de uitzondering veroorzaakten.

In de volgende sectie zullen we bekijken hoe Java 14, tot en met JEP 358, dit probleem oplost.

3. Nuttig NullPointerExceptions

SAP geïmplementeerd Nuttig NullPointerExceptions voor hun commerciële JVM in 2006. Het werd voorgesteld als een verbetering van de OpenJDK-gemeenschap in februari 2019, en snel daarna werd het een JEP. Bijgevolg was de functie in oktober 2019 voltooid en gepusht voor de JDK 14-release.

In wezen is JEP 358 gericht op het verbeteren van de leesbaarheid van NullPointerExceptions, gegenereerd door JVM, door te beschrijven welke variabele is nul.

JEP 358 brengt een gedetailleerd NullPointerException bericht door de nul variabele, naast de methode, de bestandsnaam en het regelnummer. Het werkt door de bytecode-instructies van het programma te analyseren. Daarom is het in staat om precies te bepalen welke variabele of uitdrukking was nul.

Het allerbelangrijkste, het gedetailleerde uitzonderingsbericht is standaard uitgeschakeld in JDK 14. Om het in te schakelen, hebben we de opdrachtregeloptie nodig:

-XX: + ShowCodeDetailsInExceptionMessages

3.1. Gedetailleerd uitzonderingsbericht

Laten we overwegen de code opnieuw uit te voeren met de ShowCodeDetailsInExceptionMessages vlag geactiveerd:

Uitzondering in thread "main" java.lang.NullPointerException: Kan "String.toLowerCase ()" niet aanroepen omdat de retourwaarde van "com.baeldung.java14.npe.HelpfulNullPointerException $ PersonalDetails.getEmailAddress ()" null is in com.baeldung. java14.npe.HelpfulNullPointerException.main (HelpfulNullPointerException.java:10)

Dit keer weten we uit de aanvullende informatie dat het ontbrekende e-mailadres van de persoonlijke gegevens van de medewerker onze uitzondering vormt. De kennis die met deze verbetering is opgedaan, kan ons tijd besparen tijdens het opsporen van fouten.

JVM stelt het gedetailleerde uitzonderingsbericht samen uit twee delen. Het eerste deel geeft de falende operatie weer, een gevolg van een referentie wezen nul, terwijl het tweede deel de reden voor de nul referentie:

Kan "String.toLowerCase ()" niet aanroepen omdat de retourwaarde van "getEmailAddress ()" null is

Om het uitzonderingsbericht op te bouwen, herschept JEP 358 het deel van de broncode dat het nul verwijzing naar de operand-stack.

3.2. Technische aspecten

Nu we een goed begrip hebben van hoe we kunnen identificeren nul verwijzingen met behulp van Helpful NullPointerExceptions, laten we eens kijken naar enkele technische aspecten ervan.

Ten eerste, een gedetailleerde berichtberekening wordt alleen gedaan als de JVM zelf een NullPointerException de berekening wordt niet uitgevoerd als we expliciet de uitzondering gooien in onze Java-code. De reden hierachter is dat we in deze situaties hoogstwaarschijnlijk al een zinvol bericht doorgeven in de exception constructor.

Ten tweede, JEP 358 berekent het bericht lui, wat alleen betekent wanneer we het uitzonderingsbericht afdrukken en niet wanneer de uitzondering zich voordoet. Als gevolg hiervan zou er geen prestatie-impact moeten zijn voor de gebruikelijke JVM-stromen, waar we uitzonderingen opvangen en opnieuw plaatsen, aangezien we niet altijd het uitzonderingsbericht afdrukken.

Tenslotte, het gedetailleerde uitzonderingsbericht kan namen van lokale variabelen uit onze broncode bevatten. We zouden dit dus als een mogelijk beveiligingsrisico kunnen beschouwen. Dit gebeurt echter alleen als we code uitvoeren die is gecompileerd met de -g vlag geactiveerd, die foutopsporingsinformatie genereert en toevoegt aan ons klassenbestand.

Beschouw een eenvoudig voorbeeld dat we hebben samengesteld om deze aanvullende foutopsporingsinformatie op te nemen:

Medewerker medewerker = null; werknemer.getName ();

Wanneer we deze code uitvoeren, drukt het uitzonderingsbericht de naam van de lokale variabele af:

Kan "com.baeldung.java14.npe.HelpfulNullPointerException $ Employee.getName ()" niet aanroepen omdat "employee" null is

Daarentegen biedt de JVM zonder aanvullende foutopsporingsinformatie alleen wat het weet over de variabele in het gedetailleerde bericht:

Kan "com.baeldung.java14.npe.HelpfulNullPointerException $ Employee.getName ()" niet aanroepen omdat "" null is

In plaats van de lokale variabelenaam (werknemer), drukt de JVM de variabele index af die is toegewezen door de compiler.

4. Conclusie

In deze korte tutorial hebben we geleerd over Helpful NullPointerExceptions in Java 14. Zoals hierboven getoond, helpen verbeterde berichten ons om code sneller te debuggen vanwege de broncode details die aanwezig zijn in de uitzonderingsberichten.

Zoals altijd is de volledige broncode van het artikel beschikbaar op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found