Null pointer kivétel Java nyelven
A Java NullPointerException egy RuntimeException. Akkor fordul elő, amikor egy program null értékű objektumhivatkozást próbál meg használni. Java-ban a „null” egy speciális érték, amely az objektumhivatkozásokhoz rendelhető, jelezve az érték hiányát.
A nullamutató kivételének okai
A NullPointerException a következő okok miatt fordul elő:
- Metódus meghívása null objektumból.
- Nulla objektum mezőjének elérése vagy módosítása.
- A null hosszát úgy véve, mintha egy tömb lenne.
- A nullobjektumok helyeinek elérése vagy módosítása úgy, mintha az egy tömb lenne.
- A nullát dobja, mintha dobható érték lenne.
- Amikor null objektumon keresztül próbál szinkronizálni.
Példa:
Java public class Geeks { public static void main ( String [] args ) { // Reference set to null String s = null ; System . out . println ( s . length ()); } }
Kimenet:
Hangup (SIGHUP)
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)Magyarázat: Ebben a példában az „s” karakterlánc-hivatkozás nulla. Amikor a program megpróbálja meghívni a length() metódust, akkor egy NullPointerException kivételt dob, mert nincs tényleges objektum.
Miért a null használatos a Java-ban?
A null érték helyőrzőként szolgál, és azt jelzi, hogy nincs érték hozzárendelve egy referenciaváltozóhoz. A gyakori alkalmazások a következők:
- Kapcsolt adatszerkezetek : Lista vagy faág végét jelöli.
- Tervezési minták : Ez olyan mintákban használatos, mint a Null Object Pattern vagy Singleton Pattern.
Hogyan lehet elkerülni a NullPointerException-t
A NullPointerException elkerülése érdekében meg kell győződnünk arról, hogy minden objektum megfelelően inicializálva van, mielőtt használnánk őket. Amikor deklarálunk egy referenciaváltozót, meg kell győződnünk arról, hogy az objektum nem nulla, mielőtt metódust vagy mezőt kérnénk az objektumoktól.
1. String Literálok használata egyenlőségben()
Egy nagyon gyakori esetprobléma a String változó és a literál összehasonlítása. A literál lehet egy karakterlánc vagy egy enum elem. Ahelyett, hogy a null objektumból hívná meg a metódust, fontolja meg a literálból való meghívását.
Példa:
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' ); } } }
Kimenet
NullPointerException Caught
A NullPointerException kivételét elkerülhetjük, ha az egyenlőt literálra hívjuk, nem pedig objektumra.
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' ); } } }
Kimenet
Not Same
Jegyzet : Mindig hívja meg az egyenlő értéket a literálban, hogy elkerülje a metódus hívását nulla hivatkozáson.
2. A módszer argumentumainak ellenőrzése
Az új metódus törzsének végrehajtása előtt először ellenőriznünk kell az argumentumokat null értékekre, és csak akkor kell folytatni a metódus végrehajtását, ha az argumentumokat megfelelően ellenőriztük. Ellenkező esetben IllegalArgumentException kivételt dob, és értesíti a hívó metódust, hogy valami nincs rendben az átadott argumentumokkal.
Példa:
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 (); } }
Kimenet
0 13 IllegalArgumentException caught
3. Használja a Ternary Operatort
A háromtagú operátor használható a NullPointerException elkerülésére. Először a Boole-féle kifejezés kerül kiértékelésre. Ha a kifejezés igaz, akkor az érték1 kerül visszaadásra, ellenkező esetben az érték2. Használhatjuk a háromtagú operátort a null mutatók kezelésére.
Példa:
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 ); } }
Kimenet
Geeks
Magyarázat : A háromtagú operátor segít a null-ellenőrzésben és a nulla hivatkozásokon végzett műveletek elkerülésében.
4. Opcionális osztály használata (Java 8+)
A Java 8-ban az opcionális osztályt olyan konténerobjektumként vezették be, amely tartalmazhat nem null értéket, vagy nem. Segít elkerülni NullPointerException azáltal, hogy arra kényszeríti, hogy kifejezetten kezelje azt az esetet, amikor egy érték hiányzik.
Példa:
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 } }
Kimenet
Default Name
Magyarázat: Az Optional.ofNullable(value) becsomagolja az értéket, amely lehet null. Az orElse() tartalékot biztosít, ha az érték nincs jelen.