Nyttige NullPointerExceptions i Java 14

1. Oversigt

I denne vejledning fortsætter vi vores serie om Java 14 ved at se på Nyttig NullPointerExceptions, som er en ny funktion introduceret med denne version af JDK.

2. Traditionel NullPointerExceptions

I praksis ser eller skriver vi ofte kode, der kæder metoder i Java. Men når denne kode kaster en NullPointerException, kan det blive svært at vide, hvorfra undtagelsen stammer.

Lad os antage, at vi vil finde ud af en medarbejders e-mail-adresse:

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

Hvis den medarbejder objekt, getPersonalDetails () eller getEmailAddress () er nul, JVM kaster en NullPointerException:

Undtagelse i tråden "main" java.lang.NullPointerException på com.baeldung.java14.npe.HelpfulNullPointerException.main (HelpfulNullPointerException.java:10)

Hvad er årsagen til undtagelsen? Det er svært at bestemme, hvilken variabel der er nul uden at bruge en debugger. Desuden udskriver JVM kun metoden, filnavnet og linjenummeret, der forårsagede undtagelsen.

I det næste afsnit vil vi se på, hvordan Java 14 gennem JEP 358, vil løse dette problem.

3. Nyttig NullPointerExceptions

SAP implementeret Nyttig NullPointerExceptions til deres kommercielle JVM i 2006. Det blev foreslået som en forbedring af OpenJDK-samfundet i februar 2019, og hurtigt derefter blev det en JEP. Derfor blev funktionen færdig og skubbet i oktober 2019 til JDK 14-udgivelsen.

I det væsentlige har JEP 358 til formål at forbedre læsbarheden af NullPointerExceptions, genereret af JVM, ved at beskrive, hvilken variabel der er nul.

JEP 358 giver en detaljeret beskrivelse NullPointerException besked ved at beskrive nul variabel sammen med metoden, filnavnet og linjenummeret. Det fungerer ved at analysere programmets bytecode-instruktioner. Derfor er det i stand til at bestemme præcist, hvilken variabel eller udtryk der var nul.

Mest vigtigt, den detaljerede undtagelsesmeddelelse er som standard slået fra i JDK 14. For at aktivere det skal vi bruge kommandolinjemuligheden:

-XX: + ShowCodeDetailsInExceptionMessages

3.1. Detaljeret undtagelsesmeddelelse

Lad os overveje at køre koden igen med ShowCodeDetailsInExceptionMessages flag aktiveret:

Undtagelse i tråden "main" java.lang.NullPointerException: Kan ikke påkalde "String.toLowerCase ()", fordi returværdien af ​​"com.baeldung.java14.npe.HelpfulNullPointerException $ PersonalDetails.getEmailAddress ()" er nul ved com.baeldung. java14.npe.HelpfulNullPointerException.main (HelpfulNullPointerException.java:10)

Fra denne supplerende information ved vi denne gang, at den manglende e-mail-adresse på medarbejderens personlige oplysninger forårsager vores undtagelse. Den viden, der er opnået ved denne forbedring, kan spare os tid under fejlretning.

JVM komponerer den detaljerede undtagelsesmeddelelse fra to dele. Den første del repræsenterer den svigtende operation, en konsekvens af, at en reference er nul, mens anden del identificerer årsagen til nul reference:

Kan ikke påberåbe sig "String.toLowerCase ()", fordi returværdien af ​​"getEmailAddress ()" er nul

For at oprette undtagelsesmeddelelsen genskaber JEP 358 den del af kildekoden, der skubbede nul henvisning til operandstakken.

3.2. Tekniske aspekter

Nu hvor vi har en god forståelse af, hvordan vi kan identificere nul referencer ved hjælp af hjælpsomme NullPointerExceptions, lad os se på nogle tekniske aspekter af det.

For det første, en detaljeret meddelelsesberegning udføres kun, når JVM'en selv kaster en NullPointerException beregningen udføres ikke, hvis vi udtrykkeligt kaster undtagelsen i vores Java-kode. Årsagen bag dette er, at vi i disse situationer sandsynligvis allerede videregiver en meningsfuld besked i undtagelseskonstruktøren.

For det andet JEP 358 beregner meddelelsen doven, hvilket betyder kun, når vi udskriver undtagelsesmeddelelsen, og ikke når undtagelsen opstår. Som et resultat bør der ikke være nogen præstationspåvirkning for de sædvanlige JVM-strømme, hvor vi fanger og omlægger undtagelser, da vi ikke altid udskriver undtagelsesmeddelelsen.

Langt om længe, den detaljerede undtagelsesmeddelelse kan omfatte lokale variabelnavne fra vores kildekode. Således kunne vi betragte dette som en potentiel sikkerhedsrisiko. Dette sker dog kun, når vi kører kode, der blev kompileret med -g flag aktiveret, som genererer og tilføjer fejlretningsoplysninger i vores klassefil.

Overvej et simpelt eksempel, som vi har samlet for at inkludere disse yderligere fejlretningsoplysninger:

Medarbejdermedarbejder = null; medarbejder.getnavn ();

Når vi kører denne kode, udskriver undtagelsesmeddelelsen det lokale variabelnavn:

Kan ikke påkalde "com.baeldung.java14.npe.HelpfulNullPointerException $ Employee.getName ()", fordi "medarbejder" er nul

I modsætning hertil giver JVM uden yderligere fejlretningsoplysninger kun det, den ved om variablen i den detaljerede besked:

Kan ikke påkalde "com.baeldung.java14.npe.HelpfulNullPointerException $ Employee.getName ()" fordi "" er nul

I stedet for det lokale variabelnavn (medarbejder), udskriver JVM det variable indeks, der er tildelt af compileren.

4. Konklusion

I denne hurtige vejledning lærte vi om nyttigt NullPointerExceptions i Java 14. Som vist ovenfor hjælper forbedrede meddelelser os med at fejle kode hurtigere på grund af kildekodedetaljerne i undtagelsesmeddelelserne.

Som altid er artiklens fulde kildekode tilgængelig på GitHub.