logo

Null Pointer Unntak i Java

I denne opplæringen skal vi lære Null-pekerunntaket i Java. Null-pekerunntak er et kjøretidsunntak. Null er en spesiell type verdi som kan tilordnes referansen til et objekt. Hver gang man prøver å bruke en referanse som har Null-verdien, heves NullPointerException.

Ulike scenarier for Null Pointer-unntaket

Se noen av de følgende scenariene der NullPointerException kan økes.

  • Beregner størrelsen eller lengden på null som om det var en rekke elementer.

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

Produksjon:

Unntak i tråden 'main' java.lang.NullPointerException: Kan ikke lese arraylengden fordi '' er null på ThrowNullExcep.main(ThrowNullExcep.java:7)
  • Kalle en metode ved å bruke objektet som har Null-verdien.

Filnavn: ThrowNullExcep1.java

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

Produksjon:

 Exception in thread 'main' java.lang.NullPointerException: Cannot invoke 'ThrowNullExcep1.foo()' because '' is null at ThrowNullExcep1.main(ThrowNullExcep1.java:13) 
  • Når du prøver å synkronisere over et NULL-objekt.

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

Produksjon:

 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) 
  • I stedet for å kaste en verdi, kastes Null.

Filnavn: ThrowNullExcep3.java

bash hvis annet
 // 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; } } 

Produksjon:

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

Krav til NULL-verdi

En null er en spesiell verdi som brukes i Java. Det brukes vanligvis for å vise at det ikke er noen verdi som blir tildelt referansevariabelen. En nullverdi brukes hovedsakelig i implementeringen av datastrukturer som en koblet liste eller tre. Den brukes også i Singleton-mønsteret.

Unngå NullPointerException

For å unngå NullPointerException, bør man sørge for at initialiseringen av alle objektene er gjort riktig før man kan bruke dem. Når man erklærer en referansevariabel, bør man verifisere at nullverdien ikke er tilordnet referansen før referanseverdien brukes for å få tilgang til feltet eller metoden.

Legg merke til følgende vanlige problemer med løsningen.

Tilfelle 1: Sammenligning av strenger med bokstavelig

Et av de vanlige problemene inkluderer sammenligning av en bokstavelig med en strengvariabel. Det bokstavelige kan være et element fra en Enum eller fra en streng. I stedet for å påkalle metoden fra null-objektet, bør du vurdere å påkalle den ved å bruke bokstaven.

java hei-program

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

Produksjon:

 NullPointerException has been caught. 

La oss nå se hvordan man kan unngå det.

Filnavn: NullPntrExcption1.java

linje autocad kommando
 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.'); } } } 

Produksjon:

 NullPointerException has been caught. 

Tilfelle 2: Holde et øye med metodeargumentene

Man må sjekke metodeargumentene først for nullverdiene og deretter gå med metodeutførelsen. Ellers er det rimelige sjanser for at det vil kaste et IllegalArgumentException og vil også signalisere kallemetoden at det er feil med argumentene som har blitt bestått.

hvordan konvertere fra streng til int

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

Produksjon:

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

Tilfelle 3: Bruk av ternær operatør

Man kan også bruke den ternære operatoren for å unngå NullPointerException. I ternært blir det boolske uttrykket evaluert først. Hvis uttrykket blir evaluert som sant, returneres val1. Ellers returneres val2.

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

Produksjon:

 String is Null. javaTpoint