Dacă ați petrecut ceva timp dezvoltând programe în Java, la un moment dat ați văzut cu siguranță următoarea excepție:

java.lang.NullPointerException

Unele probleme majore de producție apar din cauza NullPointerException. În acest articol, vom trece în revistă câteva modalități de gestionat NullPointerException în Java.

Verificare nulă simplă

Luați în considerare următoarea bucată de cod:

public static void main(String args[]) {
    String input1 = null;
    simpleNullCheck(input1);
}

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

Dacă rulați acest cod ca atare, veți obține următoarea excepție:

Exception in thread "main" java.lang.NullPointerException

Motivul pentru care primiți această eroare este că încercăm să efectuăm length() operație activată str1 care este null.

O soluție ușoară pentru aceasta este să adăugați o verificare nulă str1 așa cum se arată mai jos:

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

Acest lucru va asigura că, când str1 este null, nu rulați length() funcționează pe ea.

Dar este posibil să aveți următoarea întrebare.

Ce se întâmplă dacă str1 este o variabilă importantă?

În acest caz, puteți încerca așa ceva:

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

Ideea este că, atunci când te aștepți să fie o valoare null, este mai bine să puneți un null verificați acea variabilă. Și dacă valoarea se dovedește a fi null, ia o acțiune alternativă.

Acest lucru se aplică nu numai șirurilor, ci oricărui alt obiect din Java.

Lombok Null Check

Luați acum următorul exemplu:

public static void main(String args[]) {
    String input2 = "test";
    List<String> inputList = null;
    lombokNullCheck(input2, inputList, input2);
}

public static void lombokNullCheck(String str1, List<String> strList, String str2) {
    System.out.println(str1.length() + strList.size() + str2.length());
}

Aici avem o funcție care acceptă trei argumente: str1, strList, și str2.

Dacă oricare dintre aceste valori se dovedește a fi null, nu vrem să executăm deloc logica în această funcție.

Cum realizezi acest lucru?

Acesta este locul în care Lombok vine la îndemână. Pentru a adăuga biblioteca Lombok în codul dvs., includeți următoarea dependență Maven:

 <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
 </dependency>

Pentru a afla mai multe despre Maven, verificați Acest articol.

Iată cum ar arăta codul cu Lombok null Verifica:

public static void main(String args[]) {
    String input2 = "test";
    List<String> inputList = null;
    try {
        lombokNullCheck(input2, inputList, input2);
    } catch (NullPointerException e) {
        System.out.println(e);
    }

}

public static void lombokNullCheck(@NonNull String str1, @NonNull List<String> strList, @NonNull String str2) {
    System.out.println(str1.length() + strList.size() + str2.length());
}

Înainte de fiecare argument al funcției adăugăm @NonNull adnotare.

De asemenea, atunci când numim această funcție, punem un try-catch blocați în jurul apelului funcției pentru a prinde NullPointerException.

Dacă oricare dintre argumentele date în funcție se dovedește a fi null, funcția ar arunca un NullPointerException. Acest lucru va fi apoi prins de try-catch bloc.

Acest lucru asigură că, dacă vreunul dintre argumentele funcției se dovedește a fi null, atunci logica din funcție nu este executată și știm că codul nu se va comporta neobișnuit.

Acest lucru se poate face cu o grămadă de null verificați și declarațiile. Dar utilizarea Lombok ne ajută să evităm să scriem mai multe null declarațiile de verificare și face codul să pară mult mai curat.

Liste și nulități

Spuneți că aveți o listă și că doriți să imprimați toate elementele din listă:

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

Înainte de a parcurge lista, trebuie să punem un null verificați pe listă.

Dacă null verificarea nu este prezentă, încercând apoi să parcurgeți un null lista va arunca o NullPointerException.

Hărți și Nule

Să luăm scenariul în care trebuie să accesați valoarea unei anumite chei dintr-o hartă:

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

Mai întâi trebuie să facem o verificare nulă asupra obiectului hartă în sine. Dacă acest lucru nu este făcut, iar harta este null, apoi o NullPointerException este aruncat. Acest lucru se face folosind testMap!=null

Odată ce ați făcut acest lucru, verificați dacă o anumită cheie este prezentă înainte de a o accesa. Puteți verifica prezența cheii folosind testMap.containsKey("first_key"). Dacă acest lucru nu se face și cheia specială este absentă, atunci veți obține valoarea ca null.

Este necesar să adăugați întotdeauna un Null Check?

Dacă știți sigur că o anumită variabilă nu poate fi niciodată null, atunci puteți evita adăugarea null Verifica. Acest lucru poate fi aplicabil în funcții private în care puteți controla intrarea datelor în funcție.

Dar dacă nu sunteți sigur cu privire la nulitatea unui obiect, cel mai bine este să adăugați un null Verifica.

Cod

Toate codurile discutate în acest articol pot fi găsite în această repo Github.

felicitări ?

Acum știi cum să te descurci NullPointerException în Java!

Despre autor

Ador tehnologia și urmăresc progresele în domeniu. De asemenea, îmi place să îi ajut pe alții cu cunoștințele mele de tehnologie.

Simțiți-vă liber să citiți mai multe articole despre blogul meu, conectează-te cu mine pe LinkedInsau urmează-mă Stare de nervozitate.