A NullPointerException kezelése a Java-ban

Ha töltött egy kis időt Java-programok fejlesztésével, egy bizonyos ponton a következő kivételt látta:

java.lang.NullPointerException

Néhány fontosabb termelési probléma felmerül a NullPointerException. Ebben a cikkben áttekintjük NullPointerExceptiona Java használatának néhány módját .

Egyszerű Null Check

Fontolja meg a következő kóddarabot:

public static void main(String args[]) { String input1 = null; simpleNullCheck(input1); } private static void simpleNullCheck(String str1) { System.out.println(str1.length()); }

Ha úgy futtatja ezt a kódot, akkor a következő kivételt kapja:

Exception in thread "main" java.lang.NullPointerException

Azért kapja ezt a hibát, mert megpróbáljuk végrehajtani a length()művelet, str1amelyen van null.

Ennek egyszerű megoldása az, hogy hozzáad egy null ellenőrzést str1az alábbiak szerint:

private static void simpleNullCheck(String str1) { if (str1 != null) { System.out.println(str1.length()); } }

Ez biztosítja, hogy mikor str1vannull, nem futtatja a length()funkció rajta.

De felmerülhet a következő kérdés.

Mi van, ha az str1 fontos változó?

Ebben az esetben megpróbálhat ilyesmit:

 private static void simpleNullCheck(String str1) { if (str1 != null) { System.out.println(str1.length()); } else { // Perform an alternate action when str1 is null // Print a message saying that this particular field is null and hence the program has to stop and cannot continue further. } }

Az ötlet az, hogy ha egy értékre számít null, jobb, ha nullellenőrzi ezt a változót. És ha az érték valóban kiderül null, tegyen alternatív intézkedést.

Ez nemcsak a karakterláncokra, hanem a Java bármely más objektumára is érvényes.

Lombok Null Check

Vegyük a következő példát:

public static void main(String args[]) { String input2 = "test"; List inputList = null; lombokNullCheck(input2, inputList, input2); } public static void lombokNullCheck(String str1, List strList, String str2) { System.out.println(str1.length() + strList.size() + str2.length()); }

Itt van egy függvény, amely elfogadja három érv: str1, strListés str2.

Ha ezen értékek bármelyike ​​kiderül null, akkor egyáltalán nem akarjuk végrehajtani a logikát ebben a függvényben.

Hogyan éred el ezt?

Itt jön jól a Lombok. A Lombok könyvtár hozzáadásához a kódjába vegye fel a következő Maven-függőséget:

  org.projectlombok lombok 1.18.12 provided 

Ha többet szeretne megtudni Mavenről, nézze meg ezt a cikket.

Így néz ki a kód a Lombok nullcsekken:

public static void main(String args[]) { String input2 = "test"; List inputList = null; try { lombokNullCheck(input2, inputList, input2); } catch (NullPointerException e) { System.out.println(e); } } public static void lombokNullCheck(@NonNull String str1, @NonNull List strList, @NonNull String str2) { System.out.println(str1.length() + strList.size() + str2.length()); }

A függvény minden argumentuma előtt hozzáadjuk @NonNullannotáció.

Amikor ezt a függvényt meghívjuk, try-catchblokkot is teszünk a függvényhívás köré, hogy elkapjuk NullPointerException.

Ha a függvényben megadott argumentumok bármelyikének kiderül null, a függvény a-t dob NullPointerException. Ezt aztán elkapná a try-catchblokk.

Ez biztosítja, hogy ha a függvény argumentumai közül bármelyik kiderül null, akkor a függvény logikája nem kerül végrehajtásra, és tudjuk, hogy a kód nem fog szokatlanul viselkedni.

Ez megtehető egy csomó nullellenőrző nyilatkozattal is. De a Lombok használata segít elkerülni a többszörös nullellenőrző nyilatkozatok írását, és sokkal tisztábbá teszi a kódot.

Listák és Nulls

Mondja el, hogy van listája, és ki szeretné nyomtatni a lista összes elemét:

List stringList = new ArrayList(); stringList.add("ele1"); stringList.add("ele2"); if (stringList != null) { for (String element : stringList) System.out.println(element); }

Mielőtt végignéznénk a listát, nullellenőriznünk kell a listát.

Ha az nullellenőrzés nincs megadva, akkor a nulllista áthelyezésével megpróbáljuk a- t dobni NullPointerException.

Térképek és Nulls

Vegyük azt a forgatókönyvet, ahol egy adott kulcs értékéhez kell hozzáférni a térképen:

Map testMap = new HashMap(); testMap.put("first_key", "first_val"); if (testMap != null && testMap.containsKey("first_key")) { System.out.println(testMap.get("first_key")); }

Először nullát kell ellenőriznünk magán a térképobjektumon. Ha ez nem történik meg, és a térkép megtörténik null, akkor a- NullPointerExceptiont dobunk. Ez a használatával történiktestMap!=null

Miután ez megtörtént, ellenőrizze, hogy van-e egy adott kulcs, mielőtt hozzáférne hozzá. A kulcs használatával ellenőrizheti testMap.containsKey("first_key"). Ha ez nem történik meg, és az adott kulcs hiányzik, akkor az értéket as -ként kapja meg null.

Szükséges-e mindig Null Check-et adni?

Ha pontosan tudja, hogy egy adott változó soha nem lehet null, akkor elkerülheti a nullcsekk hozzáadását . Ez talán a magánfunkcióknál alkalmazható, ahol vezérelheti a funkcióba kerülő adatokat.

De ha nem biztos abban, hogy egy objektum semmissé válik-e, akkor a legjobb, ha hozzáad egy nullellenőrzést.

Kód

Az ebben a cikkben tárgyalt összes kód megtalálható ebben a Github repóban.

Gratulálok ?

Most már tudja, hogyan kell kezelni NullPointerExceptiona Java-t!

A szerzőről

Szeretem a technológiát, és követem a terület fejlődését. Szeretem másoknak is segítséget nyújtani a technikai ismereteimmel.

Nyugodtan olvashat további cikkeket a blogomon, lépjen kapcsolatba velem a LinkedIn-en, vagy kövessen a Twitteren.