logo

Nulles rādītāja izņēmums Java

Šajā apmācībā mēs apgūsim Null rādītāja izņēmumu Java. Nulles rādītāja izņēmums ir izpildlaika izņēmums. Null ir īpaša veida vērtība, ko var piešķirt objekta atsaucei. Ikreiz, kad mēģina izmantot atsauci, kurai ir Null vērtība, tiek paaugstināts NullPointerException.

Dažādi nulles rādītāja izņēmuma scenāriji

Ievērojiet dažus no tālāk norādītajiem scenārijiem, kuros var tikt izvirzīts NullPointerException.

  • Null lieluma vai garuma aprēķināšana tā, it kā tas būtu elementu masīvs.

Faila nosaukums: 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); } } 

Izvade:

Izņēmums pavedienā “main” java.lang.NullPointerIzņēmums: nevar nolasīt masīva garumu, jo '' ir nulle ThrowNullExcep.main(ThrowNullExcep.java:7)
  • Metodes izsaukšana, izmantojot objektu, kuram ir Null vērtība.

Faila nosaukums: ThrowNullExcep1.java

java masīvi
 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(); } } 

Izvade:

 Exception in thread 'main' java.lang.NullPointerException: Cannot invoke 'ThrowNullExcep1.foo()' because '' is null at ThrowNullExcep1.main(ThrowNullExcep1.java:13) 
  • Kad mēģināt sinhronizēt, izmantojot NULL objektu.

Faila nosaukums: 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); } } } 

Izvade:

 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) 
  • Tā vietā, lai mestu vērtību, tiek izmests Null.

Faila nosaukums: 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; } } 

Izvade:

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

NULL vērtības prasība

Nulle ir īpaša vērtība, kas tiek izmantota Java. To parasti izmanto, lai parādītu, ka atsauces mainīgajam nav piešķirtas vērtības. Nulles vērtību galvenokārt izmanto datu struktūru, piemēram, saistīto sarakstu vai koka, ieviešanā. To izmanto arī Singleton modelī.

Izvairīšanās no NullPointerException

Lai izvairītos no NullPointerException, pirms to izmantošanas ir jāpārliecinās, ka visu objektu inicializācija ir veikta pareizi. Deklarējot atsauces mainīgo, pirms atsauces vērtības izmantošanas, lai piekļūtu laukam vai metodei, ir jāpārbauda, ​​vai atsaucei nav piešķirta nulles vērtība.

Ievērojiet tālāk norādītās izplatītākās problēmas ar risinājumu.

1. gadījums: Stīgu salīdzinājums ar burtu

Viena no izplatītākajām problēmām ietver literāla salīdzināšanu ar String mainīgo. Literāls var būt elements no Enum vai no virknes. Tā vietā, lai izsauktu metodi no nulles objekta, apsveriet iespēju to izsaukt, izmantojot literālu.

Faila nosaukums: 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.'); } } } 

Izvade:

 NullPointerException has been caught. 

Tagad redzēsim, kā no tā izvairīties.

Faila nosaukums: 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.'); } } } 

Izvade:

 NullPointerException has been caught. 

2. gadījums: Sekojiet līdzi metodes argumentiem

Vispirms ir jāpārbauda metodes argumenti nulles vērtībām un pēc tam jāturpina metodes izpilde. Pretējā gadījumā pastāv lielas izredzes, ka tas radīs IllegalArgumentException un arī signalizēs izsaukšanas metodei, ka tā ir nepareiza ar argumentiem, kas ir nodoti.

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

Izvade:

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

3. gadījums: Trīskāršā operatora izmantošana

Var izmantot arī trīskāršu operatoru, lai izvairītos no NullPointerException. Trīskāršā veidā vispirms tiek novērtēta Būla izteiksme. Ja izteiksme tiek novērtēta kā patiesa, tiek atgriezta vērtība val1. Pretējā gadījumā tiek atgriezta val2.

Faila nosaukums: 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); } } 

Izvade:

 String is Null. javaTpoint