logo

Iznimka nultog pokazivača u Javi

U ovom vodiču naučit ćemo iznimku Null pointer u Javi. Iznimka nultog pokazivača je iznimka vremena izvođenja. Null je posebna vrsta vrijednosti koja se može dodijeliti referenci objekta. Kad god netko pokuša upotrijebiti referencu koja ima vrijednost Null, pojavljuje se NullPointerException.

inače ako je java

Različiti scenariji za iznimku nultog pokazivača

Promatrajte neke od sljedećih scenarija u kojima se može pokrenuti NullPointerException.

  • Izračunavanje veličine ili duljine Null kao da je niz elemenata.

Naziv datoteke: 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); } } 

Izlaz:

Iznimka u niti 'main' java.lang.NullPointerException: Nije moguće pročitati duljinu polja jer je '' null na ThrowNullExcep.main(ThrowNullExcep.java:7)
  • Pozivanje metode pomoću objekta koji ima vrijednost Null.

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

Izlaz:

 Exception in thread 'main' java.lang.NullPointerException: Cannot invoke 'ThrowNullExcep1.foo()' because '' is null at ThrowNullExcep1.main(ThrowNullExcep1.java:13) 
  • Kada pokušate sinkronizirati preko NULL objekta.

Naziv datoteke: 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); } } } 

Izlaz:

 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) 
  • Umjesto izbacivanja vrijednosti, izbacuje se Null.

Naziv datoteke: ThrowNullExcep3.java

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

Izlaz:

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

Zahtjev NULL vrijednosti

Null je posebna vrijednost koja se koristi u Javi. Obično se koristi da pokaže da ne postoji vrijednost koja se dodjeljuje referentnoj varijabli. Nulta vrijednost se uglavnom koristi u implementaciji podatkovnih struktura kao što su povezani popisi ili stabla. Također se koristi u obrascu Singleton.

Izbjegavanje NullPointerException

Kako bi se izbjegla NullPointerException, treba osigurati da se inicijalizacija svih objekata izvrši ispravno prije nego što ih netko može koristiti. Kada se deklarira referentna varijabla, treba provjeriti da nulta vrijednost nije dodijeljena referenci prije nego se referentna vrijednost upotrijebi za pristup polju ili metodi.

Obratite pozornost na sljedeće uobičajene probleme s rješenjem.

Slučaj 1: Usporedba nizova s ​​literalom

Jedan od uobičajenih problema uključuje usporedbu literala sa String varijablom. Literal može biti element iz enuma ili iz niza. Umjesto pozivanja metode iz null objekta, razmislite o pozivanju pomoću literala.

Naziv datoteke: 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.'); } } } 

Izlaz:

 NullPointerException has been caught. 

Sada, da vidimo kako se to može izbjeći.

Naziv datoteke: 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.'); } } } 

Izlaz:

 NullPointerException has been caught. 

Slučaj 2: Pazeći na argumente metode

Prvo se moraju provjeriti argumenti metode za null vrijednosti, a zatim krenuti s izvođenjem metode. Inače, postoje dobre šanse da će izbaciti IllegalArgumentException i također će signalizirati pozivnoj metodi da nije u redu s argumentima koji su proslijeđeni.

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

Izlaz:

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

Slučaj 3: Upotreba ternarnog operatora

Također se može koristiti ternarni operator kako bi se izbjegla NullPointerException. U ternaru, Booleov izraz se prvi procjenjuje. Ako se izraz ocijeni kao istinit, tada se vraća val1. Inače se vraća val2.

Naziv datoteke: 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); } } 

Izlaz:

 String is Null. javaTpoint