Nyttige NullPointerExceptions i Java 14

1. Oversikt

I denne opplæringen fortsetter vi serien vår på Java 14 ved å ta en titt på Nyttig NullPointerExceptions, som er en ny funksjon introdusert med denne versjonen av JDK.

2. Tradisjonell NullPointerExceptions

I praksis ser eller skriver vi ofte kode som kjeder metoder i Java. Men når denne koden kaster en NullPointerException, kan det bli vanskelig å vite hvor unntaket kommer fra.

La oss anta at vi ønsker å finne ut en ansattes e-postadresse:

Streng emailAddress = ansatt.getPersonalDetails (). GetEmailAddress (). ToLowerCase ();

Hvis den ansatt gjenstand, getPersonalDetails () eller getEmailAddress () er null, JVM kaster en NullPointerException:

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

Hva er årsaken til unntaket? Det er vanskelig å bestemme hvilken variabel som er null uten å bruke en feilsøking. Videre vil JVM bare skrive ut metoden, filnavnet og linjenummeret som forårsaket unntaket.

I neste avsnitt ser vi på hvordan Java 14, gjennom JEP 358, vil løse dette problemet.

3. Nyttig NullPointerExceptions

SAP implementert Nyttig NullPointerExceptions for deres kommersielle JVM i 2006. Det ble foreslått som en forbedring av OpenJDK-fellesskapet i februar 2019, og raskt etter det ble det en JEP. Følgelig ble funksjonen ferdig og presset i oktober 2019 for JDK 14-utgivelsen.

I hovedsak har JEP 358 som mål å forbedre lesbarheten av NullPointerExceptions, generert av JVM, ved å beskrive hvilken variabel som er null.

JEP 358 gir en detaljert beskrivelse NullPointerException melding ved å beskrive null variabel, ved siden av metoden, filnavnet og linjenummeret. Det fungerer ved å analysere programmets bytekodeinstruksjoner. Derfor er den i stand til å bestemme nøyaktig hvilken variabel eller uttrykk som var null.

Viktigst, den detaljerte unntaksmeldingen er slått av som standard i JDK 14. For å aktivere det, må vi bruke kommandolinjealternativet:

-XX: + ShowCodeDetailsInExceptionMessages

3.1. Detaljert unntaksmelding

La oss vurdere å kjøre koden igjen med ShowCodeDetailsInExceptionMessages flagg aktivert:

Unntak i tråden "main" java.lang.NullPointerException: Kan ikke påkalle "String.toLowerCase ()" fordi returverdien til "com.baeldung.java14.npe.HelpfulNullPointerException $ PersonalDetails.getEmailAddress ()" er null ved com.baeldung. java14.npe.HelpfulNullPointerException.main (HelpfulNullPointerException.java:10)

Fra denne tilleggsinformasjonen vet vi at den manglende e-postadressen til de ansattes personlige opplysninger forårsaker vårt unntak. Kunnskapen som er oppnådd fra denne forbedringen, kan spare oss tid under feilsøking.

JVM komponerer den detaljerte unntaksmeldingen fra to deler. Den første delen representerer den mislykkede operasjonen, en konsekvens av en referanse null, mens den andre delen identifiserer årsaken til null henvisning:

Kan ikke påkalle "String.toLowerCase ()" fordi returverdien til "getEmailAddress ()" er null

For å bygge unntaksmeldingen gjenskaper JEP 358 den delen av kildekoden som presset null referanse på operandstakken.

3.2. Tekniske aspekter

Nå som vi har god forståelse for hvordan vi kan identifisere oss null referanser ved hjelp av nyttig NullPointerExceptions, la oss ta en titt på noen tekniske aspekter av det.

For det første, en detaljert meldingsberegning gjøres bare når JVM selv kaster a NullPointerException beregningen vil ikke bli utført hvis vi eksplisitt kaster unntaket i Java-koden vår. Årsaken bak dette er at vi i disse situasjonene sannsynligvis allerede sender en meningsfylt melding i unntakskonstruktøren.

For det andre, JEP 358 beregner meldingen lat, noe som bare betyr når vi skriver ut unntaksmeldingen og ikke når unntaket oppstår. Som et resultat bør det ikke ha noen ytelsespåvirkning for de vanlige JVM-strømningene, der vi fanger og omlegger unntak, siden vi ikke alltid skriver ut unntaksmeldingen.

Endelig, den detaljerte unntaksmeldingen kan inneholde lokale variabelnavn fra kildekoden vår. Dermed kan vi betrakte dette som en potensiell sikkerhetsrisiko. Dette skjer imidlertid bare når vi kjører kode som ble samlet med -g flagg aktivert, som genererer og legger til feilsøkingsinformasjon i klassefilen vår.

Tenk på et enkelt eksempel som vi har samlet for å inkludere denne ekstra feilsøkingsinformasjonen:

Ansatt ansatt = null; ansatte.getnavn ();

Når vi kjører denne koden, skriver unntaksmeldingen ut det lokale variabelnavnet:

Kan ikke påkalle "com.baeldung.java14.npe.HelpfulNullPointerException $ Employee.getName ()" fordi "ansatt" er null

Derimot, uten ytterligere feilsøkingsinformasjon, gir JVM bare det den vet om variabelen i den detaljerte meldingen:

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

I stedet for det lokale variabelnavnet (ansatt), skriver JVM ut variabelindeksen som er tilordnet av kompilatoren.

4. Konklusjon

I denne raske opplæringen lærte vi om Nyttig NullPointerExceptions i Java 14. Som vist ovenfor hjelper forbedrede meldinger oss med å feilsøke koden raskere på grunn av kildekodedetaljene i unntaksmeldingene.

Som alltid er hele kildekoden til artikkelen tilgjengelig på GitHub.


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