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 NullPointerException
a 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, str1
amelyen van null
.
Ennek egyszerű megoldása az, hogy hozzáad egy null ellenőrzést str1
az alábbiak szerint:
private static void simpleNullCheck(String str1) { if (str1 != null) { System.out.println(str1.length()); } }
Ez biztosítja, hogy mikor str1
vannull
, 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 null
ellenő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 null
csekken:
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 @NonNull
annotáció.
Amikor ezt a függvényt meghívjuk, try-catch
blokkot 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-catch
blokk.
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ó null
ellenőrző nyilatkozattal is. De a Lombok használata segít elkerülni a többszörös null
ellenő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, null
ellenőriznünk kell a listát.
Ha az null
ellenőrzés nincs megadva, akkor a null
lista á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- NullPointerException
t 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 null
csekk 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 null
ellenő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 NullPointerException
a 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.