Korisni NullPointerExceptions u Javi 14

1. Pregled

U ovom uputstvu nastavit ćemo našu seriju na Javi 14 bacanjem pogleda na Korisno NullPointerExceptions, što je nova značajka uvedena s ovom verzijom JDK.

2. Tradicionalni NullPointerExceptions

U praksi često vidimo ili pišemo kod koji u Java-u lancuje metode. Ali kada ovaj kod baci a NullPointerException, može postati teško znati odakle potječe iznimka.

Pretpostavimo da želimo saznati e-adresu zaposlenika:

Niz emailAddress = zaposlenik.getPersonalDetails (). GetEmailAddress (). ToLowerCase ();

Ako je zaposlenik objekt, getPersonalDetails () ili getEmailAddress () je null, JVM baca a NullPointerException:

Iznimka u niti "main" java.lang.NullPointerException na com.baeldung.java14.npe.HelpfulNullPointerException.main (HelpfulNullPointerException.java:10)

Koji je osnovni uzrok iznimke? Teško je odrediti koja je varijabla null bez korištenja programa za ispravljanje pogrešaka. Štoviše, JVM će ispisati samo metodu, naziv datoteke i broj retka koji su uzrokovali iznimku.

U sljedećem ćemo odjeljku pogledati kako će Java 14 putem JEP 358 riješiti ovaj problem.

3. Korisno NullPointerExceptions

SAP implementirao Korisno NullPointerExceptions za njihov komercijalni JVM 2006. Predložen je kao poboljšanje OpenJDK zajednice u veljači 2019., a brzo nakon toga postao je JEP. Slijedom toga, značajka je dovršena i progurana u listopadu 2019. za izdanje JDK 14.

U osnovi, JEP 358 ima za cilj poboljšati čitljivost NullPointerExceptions, generirao JVM, opisujući koja je varijabla null.

JEP 358 donosi detaljan NullPointerException poruku opisujući null varijabla, uz metodu, naziv datoteke i broj retka. Djeluje analizirajući upute za bajt kod programa. Stoga je sposoban precizno odrediti koja je varijabla ili izraz bila null.

Najvažnije, detaljna poruka o iznimci po defaultu je isključena u JDK 14. Da bismo je omogućili, moramo koristiti opciju naredbenog retka:

-XX: + ShowCodeDetailsInExceptionMessages

3.1. Detaljna poruka o iznimci

Razmislimo o ponovnom pokretanju koda s ShowCodeDetailsInExceptionMessages zastava aktivirana:

Iznimka u niti "main" java.lang.NullPointerException: Nije moguće pozvati "String.toLowerCase ()", jer je povratna vrijednost "com.baeldung.java14.npe.HelpfulNullPointerException $ PersonalDetails.getEmailAddress ()" ništavna na com.baeldung. java14.npe.HelpfulNullPointerException.main (HelpfulNullPointerException.java:10)

Ovaj put, iz dodatnih podataka znamo da nedostatak adrese e-pošte osobnih podataka zaposlenika uzrokuje našu iznimku. Znanje stečeno ovim poboljšanjem može nam uštedjeti vrijeme tijekom uklanjanja pogrešaka.

JVM sastavlja detaljnu poruku o iznimci iz dva dijela. Prvi dio predstavlja neuspjelu operaciju, posljedicu referentnog bića null, dok drugi dio identificira razlog za null referenca:

Nije moguće pozvati "String.toLowerCase ()" jer je povratna vrijednost "getEmailAddress ()" null

Da bi stvorio poruku o iznimci, JEP 358 ponovno stvara dio izvornog koda koji je gurnuo null referenca na hrpu operanda.

3.2. Tehnički aspekti

Sad kad smo dobro razumjeli kako se prepoznati null reference koristeći Korisno NullPointerExceptions, pogledajmo neke tehničke aspekte toga.

Prvo, detaljno izračunavanje poruke vrši se samo kad JVM sam baci a NullPointerException računanje se neće izvršiti ako izričito bacimo iznimku u našem Java kodu. Razlog tome je taj što u tim situacijama najvjerojatnije već prosljeđujemo značajnu poruku u konstruktoru iznimki.

Drugo, JEP 358 lijeno izračunava poruku, što znači samo kada ispisujemo poruku o iznimci, a ne kada se iznimka dogodi. Kao rezultat toga, ne bi trebalo utjecati na izvedbu za uobičajene JVM tijekove, gdje uhvatimo i ponovno izuzećemo, jer ne ispisujemo uvijek poruku o iznimci.

Konačno, detaljna poruka o iznimci može sadržavati imena lokalnih varijabli iz našeg izvornog koda. Stoga bismo ovo mogli smatrati potencijalnim sigurnosnim rizikom. Međutim, to se događa samo kada pokrenemo kod koji je kompiliran s -g aktivirana zastava koja generira i dodaje podatke o otklanjanju pogrešaka u našu datoteku klase.

Razmotrimo jednostavan primjer koji smo sastavili kako bismo uključili ove dodatne informacije o otklanjanju pogrešaka:

Zaposleni zaposlenik = null; zaposlenik.getName ();

Kada pokrenemo ovaj kôd, poruka o iznimci ispisuje naziv lokalne varijable:

Nije moguće pozvati "com.baeldung.java14.npe.HelpfulNullPointerException $ Employee.getName ()" jer je "zaposlenik" null

Suprotno tome, bez dodatnih podataka o otklanjanju pogrešaka, JVM pruža samo ono što zna o varijabli u detaljnoj poruci:

Nije moguće pozvati "com.baeldung.java14.npe.HelpfulNullPointerException $ Employee.getName ()" jer je "" null

Umjesto naziva lokalne varijable (zaposlenik), JVM ispisuje indeks varijable koji je dodijelio prevodilac.

4. Zaključak

U ovom kratkom vodiču saznali smo o korisnom NullPointerExceptions u Javi 14. Kao što je gore prikazano, poboljšane poruke pomažu nam da brže otklonimo pogreške zbog detalja izvornog koda prisutnih u porukama o iznimkama.

Kao i uvijek, puni izvorni kôd članka dostupan je na GitHub-u.


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