I denne tutorial skal vi lære null pointer-undtagelsen i Java. Null pointer-undtagelse er en runtime-undtagelse. Null er en speciel slags værdi, der kan tildeles referencen for et objekt. Hver gang man forsøger at bruge en reference, der har Null-værdien, hæves NullPointerException.
Forskellige scenarier for Null Pointer-undtagelsen
Overhold nogle af følgende scenarier, hvor NullPointerException kan hæves.
- Beregning af størrelsen eller længden af Null, som om det var en række 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); } }
Produktion:
Undtagelse i tråden 'main' java.lang.NullPointerException: Kan ikke læse array-længden, fordi '' er null på ThrowNullExcep.main(ThrowNullExcep.java:7)- Kaldning af en metode ved hjælp af objektet, der har værdien Null.
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(); } }
Produktion:
Exception in thread 'main' java.lang.NullPointerException: Cannot invoke 'ThrowNullExcep1.foo()' because '' is null at ThrowNullExcep1.main(ThrowNullExcep1.java:13)
- Når du forsøger at 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); } } }
Produktion:
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 at kaste en værdi, kastes Null.
Filnavn: ThrowNullExcep3.java
shloka mehta
// 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; } }
Produktion:
Exception in thread 'main' java.lang.NullPointerException: Cannot assign field 'a' because '' is null at ThrowExcep3.main(ThrowExcep3.java:10)
Krav om NULL-værdi
En null er en speciel værdi, der bruges i Java. Det bruges normalt til at vise, at der ikke er nogen værdi, der tildeles referencevariablen. En null-værdi bruges hovedsageligt i implementeringen af datastrukturer såsom en linket liste eller træ. Det bruges også i Singleton-mønsteret.
Undgå NullPointerException
For at undgå NullPointerException bør man sikre sig, at initialiseringen af alle objekterne er udført korrekt, før man kan bruge dem. Når man erklærer en referencevariabel, bør man verificere, at nulværdien ikke er tildelt referencen, før referenceværdien bruges til at få adgang til feltet eller metoden.
Bemærk følgende almindelige problemer med løsningen.
Case 1: Sammenligning af strenge med det bogstavelige
Et af de almindelige problemer inkluderer sammenligningen af en bogstavelig med en strengvariabel. Det bogstavelige kan være et element fra en Enum eller fra en streng. I stedet for at påberåbe metoden fra null-objektet, kan du overveje at påkalde den ved at bruge det bogstavelige.
java hej 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.'); } } }
Produktion:
NullPointerException has been caught.
Lad os nu se, hvordan man kan undgå det.
Filnavn: NullPntrExcption1.java
Log af Google-konto på Android
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.'); } } }
Produktion:
NullPointerException has been caught.
Tilfælde 2: Hold øje med metodeargumenterne
Man skal først tjekke metodeargumenterne for null-værdierne og derefter gå med metodeudførelsen. Ellers er der rimelige chancer for, at det kaster en IllegalArgumentException og vil også signalere opkaldsmetoden, at det er forkert med de argumenter, der er blevet bestået.
hvordan man konverterer 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(); } }
Produktion:
0 3 IllegalArgumentException has been caught. java.lang.IllegalArgumentException: The argument can never be null.
Tilfælde 3: Brug af ternær operatør
Man kan også bruge den ternære operator for at undgå NullPointerException. I ternært bliver det boolske udtryk evalueret først. Hvis udtrykket vurderes som sandt, 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); } }
Produktion:
String is Null. javaTpoint