logo

Výjimka nulového ukazatele v Javě

V tomto tutoriálu se naučíme výjimku ukazatele Null v Javě. Výjimka nulového ukazatele je výjimka za běhu. Null je speciální druh hodnoty, kterou lze přiřadit odkazu na objekt. Kdykoli se někdo pokusí použít odkaz, který má hodnotu Null, vyvolá se výjimka NullPointerException.

nahradit vše v řetězci java

Různé scénáře pro výjimku nulového ukazatele

Sledujte některé z následujících scénářů, kde lze vyvolat výjimku NullPointerException.

  • Výpočet velikosti nebo délky Null, jako by to bylo pole prvků.

Název souboru: 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); } } 

Výstup:

Výjimka ve vláknu 'main' java.lang.NullPointerException: Nelze přečíst délku pole, protože '' je null v ThrowNullExcep.main(ThrowNullExcep.java:7)
  • Volání metody pomocí objektu, který má hodnotu Null.

Název souboru: 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ýstup:

 Exception in thread 'main' java.lang.NullPointerException: Cannot invoke 'ThrowNullExcep1.foo()' because '' is null at ThrowNullExcep1.main(ThrowNullExcep1.java:13) 
  • Při pokusu o synchronizaci přes objekt NULL.

Název souboru: 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ýstup:

 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) 
  • Místo vyhození hodnoty je vyhozena hodnota Null.

Název souboru: 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ýstup:

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

Požadavek na hodnotu NULL

Null je speciální hodnota, která se používá v Javě. Obvykle se používá k zobrazení toho, že neexistuje žádná hodnota, která je přiřazena referenční proměnné. Hodnota null se používá hlavně při implementaci datových struktur, jako je propojený seznam nebo strom. Používá se také ve vzoru Singleton.

převést znak na řetězec java

Vyhnutí se výjimce NullPointerException

Abyste se vyhnuli výjimce NullPointerException, měli byste se ujistit, že inicializace všech objektů je provedena správně, než je lze použít. Když deklarujete referenční proměnnou, měli byste ověřit, že nulová hodnota není přiřazena k referenci, než se referenční hodnota použije pro přístup k poli nebo metodě.

Sledujte následující běžné problémy s řešením.

Případ 1: Porovnání řetězců s doslovným

Jedním z běžných problémů je porovnání literálu s proměnnou String. Literál může být prvek z Enum nebo z řetězce. Místo vyvolání metody z objektu null zvažte její vyvolání pomocí literálu.

bash spánek

Název souboru: 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ýstup:

 NullPointerException has been caught. 

Nyní se podívejme, jak se tomu lze vyhnout.

Název souboru: 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ýstup:

 NullPointerException has been caught. 

Případ 2: Sledování argumentů metody

Nejprve je třeba zkontrolovat argumenty metody na hodnoty null a poté provést provádění metody. V opačném případě existuje slušná pravděpodobnost, že vyvolá výjimku IllegalArgumentException a také signalizuje volající metodě, že je nesprávná s argumenty, které byly předány.

Název souboru: 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(); } } 

Výstup:

velikost mého monitoru
 0 3 IllegalArgumentException has been caught. java.lang.IllegalArgumentException: The argument can never be null. 

Případ 3: Použití ternárního operátora

Je také možné použít ternární operátor, abyste se vyhnuli výjimce NullPointerException. V ternárním výrazu se nejprve vyhodnotí booleovský výraz. Pokud je výraz vyhodnocen jako pravdivý, vrátí se hodnota1. Jinak je vrácena hodnota val2.

Název souboru: 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ýstup:

 String is Null. javaTpoint