Hasznos NullPointerExceptions a Java 14-ben

1. Áttekintés

Ebben az oktatóanyagban folytatjuk sorozatunkat a Java 14-en, ha megnézzük a Hasznos című cikket NullPointerExceptions, amely a JDK ezen verziójával bevezetett új funkció.

2. Hagyományos NullPointerExceptions

A gyakorlatban gyakran látunk vagy írunk olyan kódot, amely a Java-ban metódusokat láncol. De amikor ez a kód a NullPointerException, nehéz lehet megismerni, honnan származik a kivétel.

Tegyük fel, hogy meg akarjuk tudni az alkalmazott e-mail címét:

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

Ha a munkavállaló tárgy, getPersonalDetails () vagy getEmailAddress () van nulla, a JVM dob a NullPointerException:

Kivétel a "main" szálban java.lang.NullPointerException itt: com.baeldung.java14.npe.HelpfulNullPointerException.main (HelpfulNullPointerException.java:10)

Mi a kiváltó oka? Nehéz meghatározni, hogy melyik változó nulla hibakereső használata nélkül. Ezenkívül a JVM csak azt a módszert, fájlnevet és sorszámot fogja kinyomtatni, amely kivételt okozott.

A következő részben megvizsgáljuk, hogy a Java 14 a JEP 358-on keresztül hogyan oldja meg ezt a problémát.

3. Hasznos NullPointerExceptions

Az SAP hasznos NullPointerExceptions kereskedelmi JVM-jükre 2006-ban. Az OpenJDK közösség fejlesztésére 2019 februárjában javasolták, és ezt követően hamarosan JEP lett. Következésképpen a funkció elkészült és 2019 októberében került bevezetésre a JDK 14 kiadáshoz.

Lényegében a JEP 358 célja a NullPointerExceptions, amelyet a JVM generált, leírva, hogy melyik változó nulla.

A JEP 358 részletesen bemutatja NullPointerException üzenetet a nulla változó, a metódus, a fájlnév és a sorszám mellett. A program bytecode utasításainak elemzésével működik. Ezért képes pontosan meghatározni, hogy mely változó vagy kifejezés volt nulla.

A legfontosabb, a részletes kivételüzenet alapértelmezés szerint ki van kapcsolva a JDK 14-ben. Engedélyezéséhez a parancssori opciót kell használnunk:

-XX: + ShowCodeDetailsInExceptionMessages

3.1. Részletes kivétel üzenet

Vegyük fontolóra a kód újbóli futtatását a ShowCodeDetailsInExceptionMessages aktiválva:

Kivétel a "main" szálban java.lang.NullPointerException: Nem lehet meghívni a "String.toLowerCase ()" elemet, mert a "com.baeldung.java14.npe.HelpfulNullPointerException $ PersonalDetails.getEmailAddress ()" visszatérési értéke a com.baeldung értéknél null. java14.npe.HelpfulNullPointerException.main (HelpfulNullPointerException.java:10)

Ezúttal a kiegészítő információkból tudjuk, hogy a munkavállaló személyes adatainak hiányzó e-mail címe kivételt jelent. Az ezzel a fejlesztéssel szerzett ismeretek időt takaríthatnak meg a hibakeresés során.

A JVM két részből állítja össze a részletes kivételüzenetet. Az első rész a meghibásodott műveletet mutatja, egy referencia lény következménye nulla, míg a második rész meghatározza a nulla referencia:

Nem lehet meghívni a "String.toLowerCase ()" fájlt, mert a "getEmailAddress ()" visszatérési értéke nulla

A kivételüzenet összeállításához a JEP 358 újra létrehozza a forráskód azon részét, amely a nulla hivatkozás az operandus veremre.

3.2. Műszaki szempontok

Most, hogy jól megértettük az azonosítás módját nulla hivatkozások a Hasznos segítségével NullPointerExceptions, vessünk egy pillantást néhány technikai aspektusára.

Először, az üzenet részletes kiszámítását csak akkor végezzük, amikor a JVM maga dob egy NullPointerException a számítást nem hajtjuk végre, ha kifejezetten megadjuk a kivételt Java kódunkban. Ennek oka az, hogy ezekben a helyzetekben valószínűleg már értelmes üzenetet adunk át a kivétel konstruktorban.

Másodszor, A JEP 358 az üzenetet lustán számolja, vagyis csak akkor, ha kinyomtatjuk a kivétel üzenetet, és nem akkor, amikor a kivétel bekövetkezik. Ennek eredményeként a szokásos JVM-folyamatok esetében nem lehet semmilyen hatással a teljesítményre, ahol kivételeket fogunk és újravetünk, mivel nem mindig nyomtatjuk a kivétel üzenetet.

Végül, a részletes kivételüzenet tartalmazhat helyi változóneveket a forráskódunkból. Így ezt potenciális biztonsági kockázatnak tekinthetjük. Ez azonban csak akkor történik meg, amikor a -g aktiválva a flag, amely generál és hibakeresési információkat ad az osztályfájlunkba.

Vegyünk egy egyszerű példát, amelyet összeállítottunk a további hibakeresési információk felvételére:

Alkalmazott alkalmazott = null; alkalmazott.címNév ();

Amikor futtatjuk ezt a kódot, a kivétel üzenet kinyomtatja a helyi változó nevét:

Nem lehet meghívni a "com.baeldung.java14.npe.HelpfulNullPointerException $ Employee.getName ()" szót, mert az "alkalmazott" értéke null

Ezzel szemben további hibakeresési információk nélkül a JVM csak azt adja meg, amit tud a változóról a részletes üzenetben:

A "com.baeldung.java14.npe.HelpfulNullPointerException $ Employee.getName ()" nem hívható meg, mert a "" értéke null

A helyi változó neve helyett (munkavállaló), a JVM kinyomtatja a fordító által kijelölt változó indexet.

4. Következtetés

Ebben a gyors bemutatóban megismerhettük a Hasznos funkciót NullPointerExceptions a Java 14-ben. Amint fentebb látható, a továbbfejlesztett üzenetek segítenek a kód gyorsabb hibakeresésében a kivételes üzenetekben található forráskód-részletek miatt.

Mint mindig, a cikk teljes forráskódja elérhető a GitHubon.


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