Kuidas NullPointerExceptionit Java-s käsitseda

Kui olete Java programme arendanud mõnda aega, olete mingil hetkel kindlasti näinud järgmist erandit:

java.lang.NullPointerException

Mõned suured tootmisprobleemid tekivad NullPointerException. Selles artiklis käsitleme mõningaid viise NullPointerExceptionJava-s käsitlemiseks.

Lihtne nullkontroll

Mõelge järgmisele koodile:

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

Kui käivitate selle koodi sellisena, saate järgmise erandi:

Exception in thread "main" java.lang.NullPointerException

Selle vea ilmnemise põhjus on see, et me proovime seda teha length()operatsioon, str1millel on null.

Lihtne lahendus on lisada nullkontroll str1nagu allpool näidatud:

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

See tagab, et millal str1onnull, te ei käivita length()funktsiooni.

Kuid teil võib olla järgmine küsimus.

Mis siis, kui str1 on oluline muutuja?

Sel juhul võite proovida midagi sellist:

 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. } }

Idee on selles, et kui eeldate, et väärtus on null, on parem nullseda muutujat kontrollida. Ja kui väärtus tõepoolest osutub null, siis tehke mõni muu toiming.

See ei kehti mitte ainult stringide, vaid kõigi muude Java objektide kohta.

Lomboki nullkontroll

Võtke nüüd järgmine näide:

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()); }

Siin on meil funktsioon, mis võtab kolm argumenti: str1, strListja str2.

Kui mõni neist väärtustest osutub, nullei soovi me selles funktsioonis loogikat üldse täita.

Kuidas seda saavutada?

Siin on Lombok käepärane. Lomboki teegi lisamiseks oma koodi lisage järgmine Maveni sõltuvus:

  org.projectlombok lombok 1.18.12 provided 

Maveni kohta lisateabe saamiseks vaadake seda artiklit.

Lomboki nulltšeki abil näeb kood välja järgmine :

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()); }

Enne funktsiooni iga argumenti lisame @NonNullannotatsioon.

Ka kui kutsume seda funktsiooni, panime try-catchfunktsiooni kõne ümber bloki, et seda püüda NullPointerException.

Kui mõni funktsioonis antud argumentidest osutub null, viskaks funktsioon a NullPointerException. See jääks siis try-catchbloki kätte.

See tagab, et kui mõni funktsiooni argumentidest osutub null, siis funktsiooni loogikat ei täideta ja me teame, et kood ei käitu ebatavaliselt.

Seda saab teha ka hulga nulltšekkide väljavõtetega. Kuid Lomboki kasutamine aitab meil vältida mitme nullkontrollväljavõtte kirjutamist ja muudab koodi palju puhtamaks.

Nimekirjad ja tühjad

Oletame, et teil on loend ja soovite printida kõik loendi elemendid:

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

Enne loendi vaatamist peame loendis nullkontrollima.

Kui nulltšekki pole, siis nullloendist üle liikumise proovimine loob a NullPointerException.

Kaardid ja Nullid

Võtame stsenaariumi, kus peate kaardil juurde pääsema konkreetse võtme väärtusele:

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

Kõigepealt peame tegema nullkontrolli kaardiobjektil endal. Kui seda ei tehta ja kaart on null, siis NullPointerExceptionvisatakse a. Seda tehakse kasutadestestMap!=null

Kui see on tehtud, kontrollige enne sellele juurdepääsemist, kas konkreetne võti on olemas. Võti olemasolu saate kontrollida kasutades testMap.containsKey("first_key"). Kui seda ei tehta ja konkreetne võti puudub, saate väärtuse nimega null.

Kas on vaja alati lisada nulltšekk?

Kui teate kindlalt, et konkreetne muutuja ei saa kunagi olla null, saate nulltšeki lisamisest hoiduda . See võib olla rakendatav privaatsetes funktsioonides, kus saate kontrollida funktsiooni sisenevaid andmeid.

Kuid kui te pole objekti tühisuses tegelikult kindel, on kõige parem lisada nullkontroll.

Kood

Kogu selles artiklis käsitletud koodi leiate sellest Githubi repost.

Palju õnne ?

Nüüd teate, kuidas NullPointerExceptionJava-s hakkama saada!

Autori kohta

Ma armastan tehnoloogiat ja jälgin selles valdkonnas tehtud edusamme. Mulle meeldib ka teisi oma tehnikateadmistega aidata.

Lugege julgelt rohkem minu artikleid oma ajaveebist, võtke minuga ühendust LinkedInis või jälgige mind Twitteris.