Kako postupati s NullPointerExceptionom na Javi

Ako ste neko vrijeme proveli razvijajući programe na Javi, u nekom ste trenutku definitivno vidjeli sljedeću iznimku:

java.lang.NullPointerException

Neki glavni problemi s proizvodnjom nastaju zbog NullPointerException. U ovom ćemo članku razmotriti neke načine rukovanja NullPointerExceptionu Javi.

Jednostavna provjera nule

Razmotrite sljedeći dio koda:

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

Ako pokrenete ovaj kod kakav je, dobit ćete sljedeću iznimku:

Exception in thread "main" java.lang.NullPointerException

Razlog što dobivate ovu pogrešku je taj što pokušavamo izvesti length()operacija na str1kojoj je null.

Jednostavno rješenje za to je dodavanje ništetne provjere str1kao što je prikazano niže:

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

To će osigurati da, kada str1jenull, ne pokrećete length()funkcioniraju na njemu.

Ali možda imate sljedeće pitanje.

Što ako je str1 važna varijabla?

U tom slučaju možete probati nešto poput ovog:

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

Ideja je da je, kada očekujete da vrijednost bude nullbolja, bolje nullprovjeriti tu varijablu. A ako se vrijednost pokaže null, poduzmite alternativnu akciju.

To se odnosi ne samo na nizove, već i na bilo koji drugi objekt u Javi.

Provjera nule Lomboka

Uzmimo sljedeći primjer:

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

Ovdje imamo funkciju koja prihvaća tri argumente: str1, strListi str2.

Ako se pokaže bilo koja od ovih vrijednosti null, uopće ne želimo izvršavati logiku u ovoj funkciji.

Kako se to postiže?

Tu Lombok dobro dolazi. Da biste dodali Lombok biblioteku u svoj kod, uključite sljedeću Mavenovu ovisnost:

  org.projectlombok lombok 1.18.12 provided 

Da biste saznali više o Mavenu, pogledajte ovaj članak.

Evo kako bi kod izgledao s nullprovjerom Lombok :

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

Prije svakog argumenta funkcije koju dodajemo @NonNullbilješka.

Također kada pozovemo ovu funkciju, stavimo try-catchblok oko poziva funkcije za hvatanje NullPointerException.

Ako se ispostavi da je bilo koji od argumenata danih u funkciji null, funkcija bi bacila a NullPointerException. To bi onda try-catchblok uhvatio .

To osigurava da, ako se ispostavi da bilo koji od argumenata funkcije null, tada se logika u funkciji ne izvršava i znamo da se kod neće ponašati neobično.

To se može učiniti i s hrpom nullizvoda za provjeru. Ali upotreba Lomboka pomaže nam izbjeći pisanje višestrukih nullizjava za provjeru i čini kod mnogo čišćim.

Popisi i nule

Recimo da imate popis i želite ispisati sve elemente na popisu:

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

Prije pregledavanja popisa, moramo staviti nullprovjeru na popis.

Ako nullček nije prisutan, tada će pokušaj petljanja po nullpopisu baciti a NullPointerException.

Karte i nule

Uzmimo scenarij u kojem trebate pristupiti vrijednosti za određeni ključ na karti:

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

Prvo moramo obaviti nultu provjeru samog objekta karte. Ako to nije učinjeno, a karta jest null, NullPointerExceptionbaca se a. To se radi pomoćutestMap!=null

Kad je to gotovo, prije pristupanja provjerite je li prisutan određeni ključ. Prisutnost ključa možete provjeriti pomoću testMap.containsKey("first_key"). Ako to nije učinjeno, a određeni ključ odsutan, dobit ćete vrijednost kao null.

Je li potrebno uvijek dodati Null Check?

Ako sa sigurnošću znate da određena varijabla nikada ne može biti null, tada možete izbjeći dodavanje nullčeka. To je možda primjenjivo u privatnim funkcijama gdje možete kontrolirati podatke koji ulaze u funkciju.

Ali ako niste baš sigurni u poništivost predmeta, najbolje je dodati nullprovjeru.

Kodirati

Sav kôd o kojem se raspravlja u ovom članku može se naći u ovom Github repo-u.

Čestitamo ?

Sada znate kako se rukuje NullPointerExceptionu Javi!

O autoru

Volim tehnologiju i pratim napredak na terenu. Također volim pomagati drugima svojim znanjem o tehnologiji.

Slobodno pročitajte više mojih članaka na mom blogu, povežite se sa mnom na LinkedInu ili me pratite na Twitteru.