logo

Null Pointer Excepție în Java

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 date
Java
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:

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');  }  } } 

Ieșire
NullPointerException Caught

Putem evita NullPointerException apelând equals pe literal, mai degrabă decât pe obiect.

funcții în c
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');  }  } } 

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:

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();  } } 

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:

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);  } } 

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:

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  } } 

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ă.