Výnimka nulového ukazovateľa v jazyku Java
Výnimka NullPointerException v jazyku Java je výnimka RuntimeException. Vyskytuje sa, keď sa program pokúsi použiť odkaz na objekt, ktorý má hodnotu null. V jazyku Java je 'null' špeciálna hodnota, ktorá môže byť priradená k objektovým referenciám na označenie absencie hodnoty.
Dôvody výnimky nulového ukazovateľa
Výnimka NullPointerException sa vyskytuje z nasledujúcich dôvodov:
- Vyvolanie metódy z nulového objektu.
- Prístup alebo úprava poľa nulového objektu.
- Ak vezmeme dĺžku null, ako keby to bolo pole.
- Prístup alebo úprava slotov nulových objektov, ako keby to bolo pole.
- Hádzanie null, ako keby to bola hodnota Throwable.
- Pri pokuse o synchronizáciu cez nulový objekt.
Príklad:
Java public class Geeks { public static void main ( String [] args ) { // Reference set to null String s = null ; System . out . println ( s . length ()); } }
výstup:
Hangup (SIGHUP)
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)Vysvetlenie: V tomto príklade je odkaz na reťazec „s“ null. Keď sa program pokúsi zavolať metódu length(), vyvolá výnimku NullPointerException, pretože neexistuje žiadny skutočný objekt.
Prečo sa v jazyku Java používa null?
Nulová hodnota slúži ako zástupný symbol a označuje, že referenčnej premennej nie je priradená žiadna hodnota. Bežné aplikácie zahŕňajú:
- Prepojené dátové štruktúry : Predstavuje koniec zoznamu alebo vetvy stromu.
- Dizajnové vzory : Používa sa vo vzoroch, ako je vzor nulového objektu alebo vzor Singleton.
Ako sa vyhnúť výnimke NullPointerException
Aby sme sa vyhli výnimke NullPointerException, musíme zabezpečiť, aby boli všetky objekty pred použitím správne inicializované. Keď deklarujeme referenčnú premennú, musíme overiť, či objekt nie je nulový, skôr než od objektov požiadame o metódu alebo pole.
1. Použitie reťazcových literálov v equals()
Veľmi častý problém s prípadmi zahŕňa porovnanie medzi premennou typu String a literálom. Literál môže byť reťazec alebo prvok Enum. Namiesto vyvolania metódy z nulového objektu zvážte jej vyvolanie z literálu.
Príklad:
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' ); } } }
Výstup
NullPointerException Caught
Výnimke NullPointerException sa môžeme vyhnúť volaním rovná sa skôr na doslov než na 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' ); } } }
Výstup
Not Same
Poznámka : Vždy vyvolávajte rovná sa na literáli, aby ste sa vyhli volaniu metódy na nulovom odkaze.
2. Kontrola argumentov metódy
Pred spustením tela novej metódy by sme mali najprv skontrolovať jej argumenty na nulové hodnoty a pokračovať vo vykonávaní metódy až vtedy, keď sú argumenty správne skontrolované. V opačnom prípade vyvolá výnimku IllegalArgumentException a upozorní volajúcu metódu, že niečo nie je v poriadku s odovzdanými argumentmi.
Príklad:
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 (); } }
Výstup
0 13 IllegalArgumentException caught
3. Použite ternárny operátor
Na vyhnutie sa výnimke NullPointerException možno použiť ternárny operátor. Najprv sa vyhodnotí boolovský výraz. Ak je výraz pravdivý, vráti sa hodnota1, inak sa vráti hodnota2. Na manipuláciu s nulovými ukazovateľmi môžeme použiť ternárny operátor.
Príklad:
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 ); } }
Výstup
Geeks
Vysvetlenie : Ternárny operátor pomáha kontrolovať nulové hodnoty a vyhýbať sa operáciám s nulovými referenciami.
4. Používanie voliteľnej triedy (Java 8+)
V jazyku Java 8 bola voliteľná trieda zavedená ako kontajnerový objekt, ktorý môže alebo nemusí obsahovať nenulovú hodnotu. Pomáha vyhnúť sa Výnimka NullPointerException prinútením explicitne riešiť prípad, keď hodnota chýba.
Príklad:
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 } }
Výstup
Default Name
Vysvetlenie: Optional.ofNullable(value) zabalí hodnotu, ktorá môže byť null. orElse() poskytuje núdzové riešenie, ak hodnota nie je prítomná.