Sådan håndteres NullPointerException i Java

Hvis du har brugt noget tid på at udvikle programmer i Java, har du på et tidspunkt bestemt set følgende undtagelse:

java.lang.NullPointerException

Nogle større produktionsproblemer opstår pga NullPointerException. I denne artikel gennemgår vi nogle måder at håndtere NullPointerExceptioni Java på.

Enkel nulkontrol

Overvej følgende kode:

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

Hvis du kører denne kode som den er, får du følgende undtagelse:

Exception in thread "main" java.lang.NullPointerException

Årsagen til, at du får denne fejl, er fordi vi prøver at udføre length()operation, str1som er null.

En let løsning på dette er at tilføje en nul check på str1som vist nedenfor:

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

Dette vil sikre, at når str1ernull, du kører ikke length()funktion på det.

Men du kan have følgende spørgsmål.

Hvad hvis str1 er en vigtig variabel?

I så fald kan du prøve noget som dette:

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

Ideen er, at når du forventer, at en værdi skal være null, er det bedre at nullkontrollere denne variabel. Og hvis værdien viser sig at være null, skal du tage en alternativ handling.

Dette gælder ikke kun for strenge, men for ethvert andet objekt i Java.

Lombok Null Check

Tag nu følgende eksempel:

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

Her har vi en funktion, der accepterer tre argumenter: str1, strList, og str2.

Hvis nogen af ​​disse værdier viser sig at være null, ønsker vi overhovedet ikke at udføre logikken i denne funktion.

Hvordan opnår du dette?

Det er her Lombok er praktisk. For at tilføje Lombok-biblioteket i din kode skal du medtage følgende Maven-afhængighed:

  org.projectlombok lombok 1.18.12 provided 

For at lære mere om Maven, se denne artikel.

Sådan ser koden ud med Lombok- nullkontrollen:

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

Før hvert argument af funktionen tilføjes @NonNullkommentar.

Også når vi kalder denne funktion, sætter vi en try-catchblok omkring funktionsopkaldet for at fange NullPointerException.

Hvis nogle af argumenterne i funktionen viser sig at være null, ville funktionen kaste et NullPointerException. Dette ville derefter blive fanget af try-catchblokken.

Dette sikrer, at hvis nogen af ​​funktionsargumenterne viser sig at være null, så logikken i funktionen ikke udføres, og vi ved, at koden ikke opfører sig usædvanligt.

Dette kan også gøres med en række nullkontrolopgørelser. Men brug af Lombok hjælper os med at undgå at skrive flere nullkontrolopgørelser og får koden til at se meget renere ud.

Lister og nuller

Sig, at du har en liste, og at du vil udskrive alle elementer på listen:

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

Før vi løber over listen, skal vi sætte en nullkontrol på listen.

Hvis nullkontrollen ikke er til stede, vil et forsøg på at løkke en nullliste over en NullPointerException.

Kort og nuller

Lad os tage scenariet, hvor du skal have adgang til værdien for en bestemt nøgle på et kort:

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

Først skal vi foretage en nulcheck på selve kortobjektet. Hvis dette ikke er gjort, og kortet er null, så NullPointerExceptionkastes en. Dette gøres ved hjælp aftestMap!=null

Når det er gjort, skal du kontrollere, om en bestemt nøgle er til stede, før du får adgang til den. Du kan kontrollere tilstedeværelsen af ​​nøglen ved hjælp af testMap.containsKey("first_key"). Hvis dette ikke er gjort, og den bestemte nøgle er fraværende, får du værdien som null.

Er det nødvendigt altid at tilføje en Null Check?

Hvis du helt sikkert ved, at en bestemt variabel aldrig kan være null, kan du undgå at tilføje nullchecken. Dette gælder muligvis i private funktioner, hvor du kan styre data, der går i funktion.

Men hvis du ikke rigtig er sikker på, om et objekt er ugyldigt, er det bedst at tilføje en nullcheck.

Kode

Al den kode, der diskuteres i denne artikel, kan findes i denne Github-repo.

Tillykke ?

Du ved nu, hvordan du håndterer NullPointerExceptioni Java!

Om forfatteren

Jeg elsker teknologi og følger fremskridt inden for området. Jeg kan også godt lide at hjælpe andre med min viden om teknologi.

Du er velkommen til at læse flere af mine artikler på min blog, oprette forbindelse til mig på LinkedIn eller følge mig på Twitter.