O excepție NullPointerException în Java este o excepție RuntimeException. Apare atunci când un program încearcă să folosească o referință de obiect care are valoarea nulă. În Java, „null” este o valoare specială care poate fi atribuită referințelor obiectelor pentru a indica absența unei valori.
Motive pentru excepția indicatorului nul
O excepție NullPointerException apare din următoarele motive:
- Invocarea unei metode dintr-un obiect nul.
- Accesarea sau modificarea câmpului unui obiect nul.
- Luând lungimea null ca și cum ar fi o matrice.
- Accesarea sau modificarea sloturilor obiectelor nule ca și cum ar fi o matrice.
- Aruncarea null ca și cum ar fi o valoare Throwable.
- Când încercați să sincronizați peste un obiect nul.
Exemplu:
protocoale de nivel de legătură de dateJava
public class Geeks { public static void main(String[] args) { // Reference set to null String s = null; System.out.println(s.length()); } }
Ieșire:
Hangup (SIGHUP)
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)
Explicaţie: În acest exemplu, referința șirului „s” este nulă. Când programul încearcă să apeleze metoda length() aruncă o NullPointerException deoarece nu există niciun obiect real.
De ce este folosit null în Java?
Valoarea nulă servește ca substituent și indică faptul că nu este atribuită nicio valoare unei variabile de referință. Aplicațiile comune includ:
- Structuri de date legate : Reprezintă sfârșitul unei liste sau al unei ramuri de copac.
- Modele de design : Acesta este utilizat în modele precum Null Object Pattern sau Singleton Pattern.
Cum să evitați NullPointerException
Pentru a evita NullPointerException trebuie să ne asigurăm că toate obiectele sunt inițializate corect înainte de a le folosi. Când declarăm o variabilă de referință trebuie să verificăm că obiectul nu este nul înainte de a solicita o metodă sau un câmp de la obiecte.
selectați ca
1. Utilizarea șirurilor de caractere literale în equals()
O problemă de caz foarte frecventă implică compararea între o variabilă String și un literal. Literalul poate fi un șir sau un element al unei Enum. În loc să invocați metoda din obiectul nul, luați în considerare invocarea acesteia din literal.
Exemplu:
Javaimport 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'); } } }
Ieșire
NullPointerException Caught
Putem evita NullPointerException apelând equals pe literal, mai degrabă decât pe obiect.
funcții în cJava
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'); } } }
Ieșire
Not Same
Nota : Invocați întotdeauna equals pe literal pentru a evita apelarea unei metode pe o referință nulă.
2. Argumentele metodei de verificare
Înainte de a executa corpul noii metode, ar trebui mai întâi să verificăm argumentele acesteia pentru valori nule și să continuăm cu executarea metodei numai atunci când argumentele sunt verificate corect. În caz contrar, va arunca o excepție IllegalArgumentException și va notifica metoda de apelare că ceva este în neregulă cu argumentele transmise.
Exemplu:
Javaimport 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(); } }
Ieșire
0 13 IllegalArgumentException caught
3. Utilizați Operatorul Ternar
Operatorul ternar poate fi folosit pentru a evita NullPointerException. Mai întâi se evaluează expresia booleană. Dacă expresia este adevărată, atunci valoarea1 este returnată, altfel valoarea2 este returnată. Putem folosi operatorul ternar pentru a gestiona pointerii nuli.
ce este prolog
Exemplu:
Javaimport 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); } }
Ieșire
Geeks
Explicaţie : Operatorul ternar ajută la verificarea null și la evitarea operațiunilor pe referințe nule.
4. Utilizarea clasei opționale (Java 8+)
În Java 8, clasa opțională a fost introdusă ca obiect container care poate conține sau nu o valoare non-nulă. Ajută la evitare NullPointerException prin forțarea de a trata în mod explicit cazul când o valoare este absentă.
Exemplu:
Javaimport 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 } }
Ieșire
Default Name
Explicaţie: Optional.ofNullable(value) include valoarea care ar putea fi nula. sau Else() oferă o rezervă dacă valoarea nu este prezentă.