V tomto návode sa naučíme výnimku nulového ukazovateľa v jazyku Java. Výnimka nulového ukazovateľa je výnimka za behu. Null je špeciálny druh hodnoty, ktorú možno priradiť referencii objektu. Vždy, keď sa niekto pokúsi použiť odkaz, ktorý má hodnotu Null, vyvolá sa výnimka NullPointerException.
Rôzne scenáre pre výnimku nulového ukazovateľa
Všimnite si niektoré z nasledujúcich scenárov, v ktorých môže byť vyvolaná výnimka NullPointerException.
- Výpočet veľkosti alebo dĺžky Null, ako keby to bolo pole prvkov.
Názov súboru: ThrowNullExcep.java
java inak ak
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); } }
Výkon:
Výnimka vo vlákne 'main' java.lang.NullPointerException: Nedá sa prečítať dĺžka poľa, pretože '' je null na ThrowNullExcep.main(ThrowNullExcep.java:7)- Volanie metódy pomocou objektu, ktorý má hodnotu Null.
Názov súboru: 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(); } }
Výkon:
Exception in thread 'main' java.lang.NullPointerException: Cannot invoke 'ThrowNullExcep1.foo()' because '' is null at ThrowNullExcep1.main(ThrowNullExcep1.java:13)
- Pri pokuse o synchronizáciu cez objekt NULL.
Názov súboru: 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); } } }
Výkon:
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)
- Namiesto vyhodenia hodnoty je vyhodená hodnota Null.
Názov súboru: 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; } }
Výkon:
ako previesť celé číslo na reťazec v jave
Exception in thread 'main' java.lang.NullPointerException: Cannot assign field 'a' because '' is null at ThrowExcep3.main(ThrowExcep3.java:10)
Požiadavka na hodnotu NULL
Null je špeciálna hodnota, ktorá sa používa v jazyku Java. Zvyčajne sa používa na zobrazenie toho, že referenčnej premennej nie je priradená žiadna hodnota. Nulová hodnota sa používa hlavne pri implementácii dátových štruktúr, ako je napríklad prepojený zoznam alebo strom. Používa sa aj vo vzore Singleton.
Vyhnúť sa výnimke NullPointerException
Aby ste sa vyhli výnimke NullPointerException, mali by ste sa uistiť, že inicializácia všetkých objektov sa vykoná správne predtým, ako ich budete môcť použiť. Keď deklarujete referenčnú premennú, mali by ste si overiť, že nulová hodnota nie je priradená k referencii skôr, ako sa referenčná hodnota použije na prístup k poľu alebo metóde.
Pri riešení dodržiavajte nasledujúce bežné problémy.
Prípad 1: Porovnanie strún s doslovným
Jedným z bežných problémov je porovnanie literálu s premennou typu String. Literál môže byť prvkom z Enum alebo z reťazca. Namiesto vyvolania metódy z objektu null zvážte jej vyvolanie pomocou literálu.
Názov súboru: 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.'); } } }
Výkon:
NullPointerException has been caught.
Teraz sa pozrime, ako sa tomu dá vyhnúť.
Názov súboru: 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.'); } } }
Výkon:
NullPointerException has been caught.
Prípad 2: Dávajte pozor na argumenty metódy
Najprv musíte skontrolovať argumenty metódy na hodnoty null a potom prejsť na vykonanie metódy. V opačnom prípade existuje veľká šanca, že vyvolá výnimku IllegalArgumentException a tiež signalizuje volajúcej metóde, že je nesprávna s argumentmi, ktoré boli odovzdané.
Názov súboru: NullPntrExcption2.java
math.pow 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(); } }
Výkon:
0 3 IllegalArgumentException has been caught. java.lang.IllegalArgumentException: The argument can never be null.
Prípad 3: Používanie ternárneho operátora
Je možné použiť aj ternárny operátor, aby ste sa vyhli výnimke NullPointerException. V trojčlennom kóde sa najprv vyhodnotí boolovský výraz. Ak je výraz vyhodnotený ako pravdivý, vráti sa hodnota1. V opačnom prípade sa vráti val2.
Názov súboru: 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); } }
Výkon:
String is Null. javaTpoint