Užitočné NullPointerExceptions v Jave 14

1. Prehľad

V tomto tutoriále budeme pokračovať v seriáli o Jave 14 tak, že sa pozrieme na užitočné NullPointerExceptions, čo je nová funkcia predstavená s touto verziou JDK.

2. Tradičné NullPointerExceptions

V praxi často vidíme alebo píšeme kód, ktorý reťazí metódy v Jave. Ale keď tento kód hodí a NullPointerException, môže byť ťažké zistiť, odkiaľ výnimka pochádza.

Predpokladajme, že chceme zistiť e-mailovú adresu zamestnanca:

Reťazec emailAddress = employee.getPersonalDetails (). GetEmailAddress (). ToLowerCase ();

Ak zamestnanec objekt, getPersonalDetails () alebo getEmailAddress () je nulový, JVM hodí a NullPointerException:

Výnimka vo vlákne „main“ java.lang.NullPointerException na adrese com.baeldung.java14.npe.HelpfulNullPointerException.main (HelpfulNullPointerException.java:10)

Čo je hlavnou príčinou výnimky? Je ťažké určiť, ktorá premenná je nulový bez použitia debuggeru. Okrem toho JVM vytlačí iba metódu, názov súboru a číslo riadku, ktoré spôsobili výnimku.

V nasledujúcej časti sa pozrieme na to, ako Java 14 prostredníctvom JEP 358 tento problém vyrieši.

3. Užitočné NullPointerExceptions

SAP implementoval Užitočné NullPointerExceptions pre ich komerčné JVM v roku 2006. Bolo to navrhnuté ako vylepšenie komunity OpenJDK vo februári 2019 a krátko potom sa stalo JEP. V dôsledku toho bola funkcia dokončená a tlačená v októbri 2019 na vydanie JDK 14.

Cieľom JEP 358 je v podstate zlepšiť čitateľnosť dokumentu NullPointerExceptions, generované JVM, opísaním ktorej premennej je nulový.

JEP 358 prináša podrobné informácie NullPointerException správa opísaním nulový premenná spolu s metódou, názvom súboru a číslom riadku. Funguje to tak, že analyzujeme inštrukcie bytecode programu. Preto je schopný presne určiť, ktorá premenná alebo výraz boli nulový.

Čo je najdôležitejšie, podrobná správa o výnimke je v JDK 14 predvolene vypnutá. Aby sme to povolili, musíme použiť voľbu príkazového riadku:

-XX: + ShowCodeDetailsInExceptionMessages

3.1. Podrobná správa o výnimke

Zvážme opätovné spustenie kódu pomocou ShowCodeDetailsInExceptionMessages príznak aktivovaný:

Výnimka vo vlákne „main“ java.lang.NullPointerException: Nie je možné vyvolať „String.toLowerCase ()“, pretože návratová hodnota „com.baeldung.java14.npe.HelpfulNullPointerException $ PersonalDetails.getEmailAddress ()“ je na adrese com.baeldung nulová. java14.npe.HelpfulNullPointerException.main (HelpfulNullPointerException.java:10)

Tentokrát z ďalších informácií vieme, že chýbajúca e-mailová adresa osobných údajov zamestnanca spôsobuje našu výnimku. Poznatky získané z tohto vylepšenia nám môžu ušetriť čas počas ladenia.

JVM skladá podrobnú správu o výnimke z dvoch častí. Prvá časť predstavuje zlyhajúcu operáciu, dôsledok existencie referencie nulový, zatiaľ čo druhá časť uvádza dôvod nulový odkaz:

Nie je možné vyvolať reťazec „String.toLowerCase ()“, pretože návratová hodnota parametra „getEmailAddress ()“ je nulová

Na zostavenie správy o výnimke JEP 358 znovu vytvorí časť zdrojového kódu, ktorá tlačila na nulový odkaz na zásobník operandov.

3.2. Technické aspekty

Teraz, keď dobre rozumieme tomu, ako identifikovať nulový referencie pomocou Užitočné NullPointerExceptions, poďme sa pozrieť na niektoré jej technické aspekty.

Po prvé, podrobný výpočet správy sa vykoná, až keď samotný JVM hodí a NullPointerException výpočet sa nevykoná, ak výslovne vylúčime výnimku v našom kóde Java. Dôvodom je to, že v týchto situáciách s najväčšou pravdepodobnosťou už odovzdáme zmysluplnú správu v konštruktore výnimiek.

Po druhé, JEP 358 počíta správu lenivo, to znamená iba vtedy, keď tlačíme správu o výnimke, a nie vtedy, keď sa výnimka vyskytne. Vo výsledku by nemal mať žiadny dopad na výkon pre bežné toky JVM, kde zachytávame a opätovne rozširujeme výnimky, pretože nie vždy správu o výnimke vytlačíme.

Nakoniec podrobná správa o výnimke môže obsahovať názvy miestnych premenných z nášho zdrojového kódu. Mohli by sme to teda považovať za potenciálne bezpečnostné riziko. To sa však stane iba vtedy, keď spustíme kód, ktorý bol kompilovaný s -g príznak aktivovaný, ktorý generuje a pridáva ladiace informácie do nášho súboru triedy.

Zvážte jednoduchý príklad, ktorý sme zostavili tak, aby obsahoval tieto ďalšie informácie o ladení:

Zamestnanec zamestnanec = null; employee.getName ();

Keď spustíme tento kód, správa o výnimke vytlačí názov lokálnej premennej:

Nie je možné vyvolať „com.baeldung.java14.npe.HelpfulNullPointerException $ Employee.getName ()“, pretože „zamestnanec“ má hodnotu null

Naopak bez ďalších informácií o ladení poskytuje JVM v podrobnej správe iba to, čo vie o premennej:

Nie je možné vyvolať „com.baeldung.java14.npe.HelpfulNullPointerException $ Employee.getName ()“, pretože „“ má hodnotu null

Namiesto názvu lokálnej premennej (zamestnanec), JVM vytlačí premenný index pridelený kompilátorom.

4. Záver

V tomto rýchlom výučbe sme sa dozvedeli niečo o Užitočnom NullPointerExceptions v Jave 14. Ako je uvedené vyššie, vylepšené správy nám pomáhajú rýchlejšie ladiť kód kvôli podrobnostiam zdrojového kódu, ktoré sa nachádzajú v správach výnimiek.

Celý zdrojový kód článku je ako vždy k dispozícii na GitHub.


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