logo

Null Pointer Exception în Java

În acest tutorial, vom învăța excepția pointerului nul în Java. Excepția pointerului nul este o excepție de rulare. Null este un tip special de valoare care poate fi atribuită referinței unui obiect. Ori de câte ori cineva încearcă să folosească o referință care are valoarea Null, este ridicată excepția NullPointerException.

Diferite scenarii pentru excepția pointerului nul

Observați unele dintre următoarele scenarii în care poate fi generată NullPointerException.

  • Calcularea mărimii sau lungimii nulului ca și cum ar fi o matrice de elemente.

Nume de fișier: ThrowNullExcep.java

 public class ThrowNullExcep { // main method public static void main(String args[]) { int arr[] = null; // array is assigned a null value System.out.println('The length of the array arr is: ' + arr.length); } } 

Ieșire:

Excepție în firul „principal” java.lang.NullPointerException: Nu se poate citi lungimea matricei deoarece „” este nul la ThrowNullExcep.main(ThrowNullExcep.java:7)
  • Apelarea unei metode folosind obiectul care are valoarea Null.

Nume de fișier: ThrowNullExcep1.java

 public class ThrowNullExcep1 { public void foo() { System.out.println('In the method foo.'); } public static void main(String args[]) { ThrowNullExcep1 obj = null; // assigning null value // invoking the method foo() obj.foo(); } } 

Ieșire:

 Exception in thread 'main' java.lang.NullPointerException: Cannot invoke 'ThrowNullExcep1.foo()' because '' is null at ThrowNullExcep1.main(ThrowNullExcep1.java:13) 
  • Când încercați să sincronizați peste un obiect NULL.

Nume de fișier: ThrowNullExcep2.java

 // A Java program that synchronizes over a NULL object. import java.util.*; import java.io.*; // A Class that is required for sending the message class Sendr { public void sendMethod(String mssg) { System.out.println('Sending message: ' + mssg ); try { Thread.sleep(100); } catch (Exception exp) { System.out.println('Thread interrupted.' + exp); } System.out.println('
' + mssg + ' is sent'); } } // A Class that is used to send messages with the help of threads Threads class ThreadSend extends Thread { private String mssg; Sendr sendr; // Received a messge obj and the string // mssge that has to be sent ThreadSend(String mStr, Sendr obj) { mssg = mStr; sendr = obj; } public void run() { // Only a single thread is allowed to send a message // at a time. synchronized(sendr) { // synchronizing the send object sendr.sendMethod(mssg); } } } // Driver class public class ThrowNullExcep2 { // main method public static void main(String args[]) { Sendr sendObj = null; ThreadSend Sth1 = new ThreadSend( ' Hello ' , sendObj ); ThreadSend Sth2 = new ThreadSend( ' Bye Bye ' , sendObj ); // Starting the two threads of the ThreadedSend type Sth1.start(); Sth2.start(); // waiting for the threads to end try { Sth1.join(); Sth2.join(); } catch(Exception exp) { System.out.println('Interrupted : ' + exp); } } } 

Ieșire:

 Exception in thread 'Thread-0' Exception in thread 'Thread-1' java.lang.NullPointerException: Cannot enter synchronized block because 'this.sendr' is null at ThreadSend.run(ThrowNullExcep2.java:42) java.lang.NullPointerException: Cannot enter synchronized block because 'this.sendr' is null at ThreadSend.run(ThrowNullExcep2.java:42) 
  • În loc să arunce o valoare, este aruncat Null.

Nume de fișier: ThrowNullExcep3.java

Rajesh Khanna
 // Modifying or accessing the fields of the Null object. public class ThrowExcep3 { int a; // main method public static void main(String args[]) { // assigning a null value ThrowExcep3 obj = null; obj.a = 3; } } 

Ieșire:

programare r in c
 Exception in thread 'main' java.lang.NullPointerException: Cannot assign field 'a' because '' is null at ThrowExcep3.main(ThrowExcep3.java:10) 

Cerința valorii NULL

Un null este o valoare specială care este utilizată în Java. De obicei, este folosit pentru a arăta că nu există nicio valoare care este atribuită variabilei de referință. O valoare nulă este utilizată în principal în implementarea structurilor de date, cum ar fi o listă legată sau un arbore. Este folosit și în modelul Singleton.

Evitarea NullPointerException

Pentru a evita NullPointerException, trebuie să vă asigurați că inițializarea tuturor obiectelor este făcută corect înainte de a le putea folosi. Când se declară o variabilă de referință, ar trebui să se verifice că valoarea nulă nu este atribuită referinței înainte ca valoarea de referință să fie utilizată pentru a accesa câmpul sau metoda.

Observați următoarele probleme comune cu soluția.

Cazul 1: Comparația șirurilor de caractere cu literalul

Una dintre problemele comune include compararea unui literal cu o variabilă String. Literalul poate fi un element dintr-o Enum sau dintr-un șir. În loc să invocați metoda din obiectul nul, luați în considerare invocarea acesteia folosind literalul.

Nume de fișier: NullPntrExcption.java

 import java.io.*; public class NullPntrExcption { // main method public static void main (String[] args) { // Initializing a String variable with a null value String pntr = null; // Checking if pntr.equals null or works fine. try { // The following line of code will raise the NullPointerException // It is because the pntr is null if (pntr.equals('JTP')) { System.out.print('String are the same.'); } else { System.out.print('Strinng are not the same.'); } } catch(NullPointerException e) { System.out.print('NullPointerException has been caught.'); } } } 

Ieșire:

 NullPointerException has been caught. 

Acum, să vedem cum se poate evita.

Nume de fișier: NullPntrExcption1.java

 public class NullPntrExcption1 { // main method public static void main (String[] args) { // Initializing a String variable with a null value String pntr = null; // Checking if pntr.equals null or works fine. try { // Now, the following line of code will not raise the NullPointerException // It is because the string literal is invoking the equals() method if ('JTP'.equals(pntr)) { System.out.print('String are the same.'); } else { System.out.print('Strinng are not the same.'); } } catch(NullPointerException e) { System.out.print('NullPointerException has been caught.'); } } } 

Ieșire:

 NullPointerException has been caught. 

Cazul 2: Ținând un ochi pe argumentele metodei

Trebuie să verificați mai întâi argumentele metodei pentru valorile nule și apoi să mergeți cu execuția metodei. În caz contrar, există șanse bune ca acesta să arunce o IllegalArgumentException și să semnaleze, de asemenea, metoda de apelare că este greșită cu argumentele care au fost transmise.

Nume de fișier: NullPntrExcption2.java

 // A program for demonstrating that one must // check the parameters are null or not before // using them. import java.io.*; public class NullPntrExcption2 { public static void main (String[] args) { // String st is an empty string and invoking method getLength() String st = ''; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught.'); } // String s set to a value and invoking method getLength() st = 'JTP'; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught.'); } // Setting st with a value null and invoking method getLength() st = null; try { System.out.println(getLength(st)); } catch(IllegalArgumentException exp) { System.out.println('IllegalArgumentException has been caught. ' + exp); } } // method taht computes the length of a string st. // It throws and IllegalArgumentException, if st is null public static int getLength(String st) { if (st == null) { throw new IllegalArgumentException('The argument can never be null.'); } return st.length(); } } 

Ieșire:

 0 3 IllegalArgumentException has been caught. java.lang.IllegalArgumentException: The argument can never be null. 

Cazul 3: Utilizarea operatorului ternar

Se poate folosi și operatorul ternar pentru a evita NullPointerException. În ternar, expresia booleană este evaluată mai întâi. Dacă expresia este evaluată ca adevărată, atunci val1 este returnat. În caz contrar, val2 este returnat.

număr aleator între 1 și 10

Nume de fișier: NullPntrExcption3.java

 // A program for demonstrating the fact that // NullPointerException can be avoided using the ternary operator. import java.io.*; public class NullPntrExcption3 { // main method public static void main (String[] args) { // Initializing String variable with null value String st = null; String mssge = (st == null) ? 'String is Null.' : st.substring(0, 5); System.out.println(mssge); // Initializing the String variable with string literal st = 'javaTpoint'; mssge = (st == null) ? '' : st.substring(0, 10); System.out.println(mssge); } } 

Ieșire:

 String is Null. javaTpoint