I den här handledningen ska vi lära oss undantaget Null-pekare i Java. Null-pekareundantag är ett runtime-undantag. Null är en speciell typ av värde som kan tilldelas referensen för ett objekt. När man försöker använda en referens som har Null-värdet, höjs NullPointerException.
Olika scenarier för undantaget Null Pointer
Observera några av följande scenarier där NullPointerException kan höjas.
10 ml till oz
- Beräknar storleken eller längden på noll som om det vore en array av element.
Filnamn: 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:
Undantag i tråden 'main' java.lang.NullPointerException: Kan inte läsa arraylängden eftersom '' är null vid ThrowNullExcep.main(ThrowNullExcep.java:7)- Anropa en metod med hjälp av objektet som har värdet Null.
Filnamn: 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(); } }
Produktion:
Exception in thread 'main' java.lang.NullPointerException: Cannot invoke 'ThrowNullExcep1.foo()' because '' is null at ThrowNullExcep1.main(ThrowNullExcep1.java:13)
- När du försöker synkronisera över ett NULL-objekt.
Filnamn: 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)
- Istället för att kasta ett värde, kastas Null.
Filnamn: 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; } }
Produktion:
Exception in thread 'main' java.lang.NullPointerException: Cannot assign field 'a' because '' is null at ThrowExcep3.main(ThrowExcep3.java:10)
Krav på NULL-värde
En null är ett speciellt värde som används i Java. Det används vanligtvis för att visa att det inte finns något värde som tilldelas referensvariabeln. Ett nollvärde används främst vid implementering av datastrukturer som en länkad lista eller träd. Det används också i Singleton-mönstret.
gimp ersätter färg
Undviker NullPointerException
För att undvika NullPointerException bör man se till att initieringen av alla objekt görs ordentligt innan man kan använda dem. När man deklarerar en referensvariabel bör man verifiera att nollvärdet inte tilldelas referensen innan referensvärdet används för att komma åt fältet eller metoden.
Observera följande vanliga problem med lösningen.
Fall 1: Jämförelse av strängar med det bokstavliga
Ett av de vanliga problemen inkluderar jämförelsen av en literal med en String-variabel. Det bokstavliga kan vara ett element från en Enum eller från en String. Istället för att anropa metoden från null-objektet, överväg att anropa den med hjälp av bokstaven.
Filnamn: 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.
Låt oss nu se hur man kan undvika det.
Filnamn: NullPntrExcption1.java
array sortera 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.'); } } }
Produktion:
NullPointerException has been caught.
Fall 2: Håller ett öga på metodargumenten
Man måste först kontrollera metodargumenten för noll-värdena och sedan gå med metodexekveringen. Annars finns det rimliga chanser att det kommer att kasta ett IllegalArgumentException och också signalerar anropsmetoden att det är fel med argumenten som har skickats.
Filnamn: 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:
java få aktuell tid
0 3 IllegalArgumentException has been caught. java.lang.IllegalArgumentException: The argument can never be null.
Fall 3: Användning av ternär operatör
Man kan också använda den ternära operatorn för att undvika NullPointerException. I ternärt utvärderas det booleska uttrycket först. Om uttrycket utvärderas som sant, returneras val1. Annars returneras val2.
Filnamn: 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