Null Pointer Undtagelse i Java
En NullPointerException i Java er en RuntimeException. Det opstår, når et program forsøger at bruge en objektreference, der har nulværdien. I Java er 'null' en speciel værdi, der kan tildeles objektreferencer for at indikere fraværet af en værdi.
Årsager til Null Pointer-undtagelse
En NullPointerException opstår af følgende årsager:
- Fremkaldelse af en metode fra et nul-objekt.
- Adgang til eller ændring af et nul-objekts felt.
- Tager længden af null, som om det var en matrix.
- Adgang til eller ændring af pladserne i nul-objekter, som om det var et array.
- Kaster null, som om det var en Kasteværdi.
- Når du forsøger at synkronisere over et null-objekt.
Eksempel:
Java public class Geeks { public static void main ( String [] args ) { // Reference set to null String s = null ; System . out . println ( s . length ()); } }
Produktion:
Hangup (SIGHUP)
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)Forklaring: I dette eksempel er strengreferencen 's' null. Når programmet forsøger at kalde length()-metoden, kaster det en NullPointerException, fordi der ikke er noget egentligt objekt.
Hvorfor bruges null i Java?
Null-værdien fungerer som en pladsholder, og den indikerer, at der ikke er tildelt nogen værdi til en referencevariabel. Almindelige applikationer omfatter:
- Sammenkædede datastrukturer : Det repræsenterer slutningen af en liste eller en trægren.
- Design mønstre : Dette bruges i mønstre som Null Object Pattern eller Singleton Pattern.
Sådan undgår du NullPointerException
For at undgå NullPointerException skal vi sikre, at alle objekterne initialiseres korrekt, før vi bruger dem. Når vi erklærer en referencevariabel, skal vi verificere, at objektet ikke er null, før vi anmoder om en metode eller et felt fra objekterne.
1. Brug af strenge bogstaver i equals()
Et meget almindeligt kasusproblem involverer sammenligningen mellem en strengvariabel og en bogstavelig. Det bogstavelige kan være en streng eller et element i en Enum. I stedet for at påberåbe metoden fra null-objektet, så overvej at påberåbe den fra det bogstavelige.
Eksempel:
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { // Initializing String variable with null value String s = null ; // Checking if s.equals null try { // This line of code throws NullPointerException because s is null if ( s . equals ( 'gfg' )) System . out . print ( 'Same' ); else System . out . print ( 'Not Same' ); } catch ( NullPointerException e ) { System . out . print ( 'NullPointerException Caught' ); } } }
Produktion
NullPointerException Caught
Vi kan undgå NullPointerException ved at kalde equals på literal i stedet for objekt.
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { // Initializing String variable with null value String s = null ; // Checking if s is null using try catch try { if ( 'gfg' . equals ( s )) System . out . print ( 'Same' ); else System . out . print ( 'Not Same' ); } catch ( NullPointerException e ) { System . out . print ( 'Caught NullPointerException' ); } } }
Produktion
Not Same
Note : Kald altid lig på bogstavet for at undgå at kalde en metode på en nulreference.
2. Kontrolmetodeargumenter
Før vi udfører brødteksten af den nye metode, bør vi først kontrollere dens argumenter for nulværdier og kun fortsætte med udførelse af metoden, når argumenterne er korrekt kontrolleret. Ellers vil den kaste en IllegalArgumentException og give den kaldende metode besked om, at der er noget galt med de beståede argumenter.
Eksempel:
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { // String s set an empty string and calling getLength() String s = '' ; try { System . out . println ( getLength ( s )); } catch ( IllegalArgumentException e ) { System . out . println ( 'IllegalArgumentException caught' ); } // String s set to a value and calling getLength() s = 'GeeksforGeeks' ; try { System . out . println ( getLength ( s )); } catch ( IllegalArgumentException e ) { System . out . println ( 'IllegalArgumentException caught' ); } // Setting s as null and calling getLength() s = null ; try { System . out . println ( getLength ( s )); } catch ( IllegalArgumentException e ) { System . out . println ( 'IllegalArgumentException caught' ); } } public static int getLength ( String s ) { if ( s == null ) throw new IllegalArgumentException ( 'The argument cannot be null' ); return s . length (); } }
Produktion
0 13 IllegalArgumentException caught
3. Brug ternær operatør
Den ternære operator kan bruges til at undgå NullPointerException. Først evalueres det boolske udtryk. Hvis udtrykket er sandt, returneres værdi1 ellers returneres værdi2. Vi kan bruge den ternære operator til at håndtere nul pointere.
Eksempel:
Java import java.io.* ; class Geeks { public static void main ( String [] args ) { String s = null ; String m = ( s == null ) ? '' : s . substring ( 0 5 ); System . out . println ( m ); s = 'Geeksforgeeks' ; m = ( s == null ) ? '' : s . substring ( 0 5 ); System . out . println ( m ); } }
Produktion
Geeks
Forklaring : Den ternære operator hjælper med at tjekke for nul og undgå operationer på nul-referencer.
4. Brug af valgfri klasse (Java 8+)
I Java 8 blev valgfri klasse introduceret som et containerobjekt, der muligvis indeholder en ikke-null værdi. Det hjælper med at undgå NullPointerException ved at tvinge til eksplicit at håndtere sagen, når en værdi er fraværende.
Eksempel:
Java import java.util.Optional ; public class OptionalExample { public static void main ( String [] args ) { Optional < String > name = Optional . ofNullable ( null ); // Safe way to access System . out . println ( name . orElse ( 'Default Name' )); // prints: Default Name } }
Produktion
Default Name
Forklaring: Optional.ofNullable(value) ombryder værdien, som kan være null. orElse() giver et fallback, hvis værdien ikke er til stede.