Nulles rādītāja izņēmums Java
NullPointerException Java ir RuntimeException. Tas notiek, kad programma mēģina izmantot objekta atsauci, kurai ir nulles vērtība. Java valodā “null” ir īpaša vērtība, ko var piešķirt objektu atsaucēm, lai norādītu uz vērtības neesamību.
Nulles rādītāja izņēmuma iemesli
NullPointerException rodas šādu iemeslu dēļ:
- Metodes izsaukšana no nulles objekta.
- Piekļuve nulles objekta laukam vai tā modificēšana.
- Ņemot nulles garumu tā, it kā tas būtu masīvs.
- Piekļuve nulles objektu slotiem vai to modificēšana tā, it kā tas būtu masīvs.
- Mest nulli, it kā tā būtu Throwable vērtība.
- Kad mēģināt sinhronizēt, izmantojot nulles objektu.
Piemērs:
Java public class Geeks { public static void main ( String [] args ) { // Reference set to null String s = null ; System . out . println ( s . length ()); } }
Izvade:
Hangup (SIGHUP)
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)Paskaidrojums: Šajā piemērā virknes atsauce “s” ir nulle. Kad programma mēģina izsaukt long() metodi, tā izmet NullPointerException, jo faktiskā objekta nav.
Kāpēc Java tiek izmantots null?
Nulles vērtība kalpo kā vietturis un norāda, ka atsauces mainīgajam nav piešķirta vērtība. Kopējās lietojumprogrammas ietver:
- Saistītās datu struktūras : tas apzīmē saraksta vai koka zara beigas.
- Dizaina modeļi : To izmanto tādos modeļos kā Null Object Pattern vai Singleton Pattern.
Kā izvairīties no NullPointerException
Lai izvairītos no NullPointerException, mums ir jāpārliecinās, ka visi objekti ir pareizi inicializēti pirms to izmantošanas. Kad mēs deklarējam atsauces mainīgo, mums ir jāpārbauda, vai objekts nav nulles, pirms mēs pieprasām no objektiem metodi vai lauku.
1. String Literals izmantošana vienādībā ()
Ļoti izplatīta gadījuma problēma ietver virknes mainīgā un literāla salīdzināšanu. Literāls var būt virkne vai Enum elements. Tā vietā, lai izsauktu metodi no nulles objekta, apsveriet iespēju to izsaukt no literāla.
Piemērs:
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' ); } } }
Izvade
NullPointerException Caught
Mēs varam izvairīties no NullPointerException, izsaucot vienlīdzību burtiski, nevis 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' ); } } }
Izvade
Not Same
Piezīme : Vienmēr izsaukt vienāds ar burtu, lai izvairītos no metodes izsaukšanas uz nulles atsauci.
2. Pārbaudes metodes argumenti
Pirms jaunās metodes pamatteksta izpildes mums vispirms jāpārbauda tās argumenti nulles vērtībām un jāturpina metodes izpilde tikai tad, kad argumenti ir pareizi pārbaudīti. Pretējā gadījumā tas parādīs IllegalArgumentException un paziņos izsaukšanas metodei, ka kaut kas nav kārtībā ar nodotajiem argumentiem.
Piemērs:
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 (); } }
Izvade
0 13 IllegalArgumentException caught
3. Izmantojiet trīskāršu operatoru
Trīskāršo operatoru var izmantot, lai izvairītos no NullPointerException. Vispirms tiek novērtēta Būla izteiksme. Ja izteiksme ir patiesa, tiek atgriezta vērtība1, pretējā gadījumā tiek atgriezta vērtība2. Mēs varam izmantot trīskāršo operatoru, lai apstrādātu nulles rādītājus.
Piemērs:
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 ); } }
Izvade
Geeks
Paskaidrojums : trīskāršais operators palīdz pārbaudīt nulles vērtību un izvairīties no darbībām ar nulles atsaucēm.
4. Izvēles klases izmantošana (Java 8+)
Programmā Java 8 Optional klase tika ieviesta kā konteinera objekts, kas var saturēt vai nesatur vērtību, kas nav nulle. Tas palīdz izvairīties NullPointerException piespiežot nepārprotami apstrādāt gadījumu, kad vērtības nav.
Piemērs:
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 } }
Izvade
Default Name
Paskaidrojums: Optional.ofNullable(value) aplauj vērtību, kas varētu būt nulle. orElse() nodrošina atkāpšanos, ja vērtības nav.