В този урок ще научим изключението Null pointer в Java. Изключението за нулев указател е изключение по време на изпълнение. Null е специален вид стойност, която може да бъде присвоена на референцията на обект. Всеки път, когато някой се опита да използва препратка, която има стойност Null, се повдига NullPointerException.
Различни сценарии за изключение за нулев указател
Наблюдавайте някои от следните сценарии, при които NullPointerException може да бъде повдигнат.
- Изчисляване на размера или дължината на Null, сякаш е масив от елементи.
Име на файл: 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); } }
Изход:
Изключение в нишката 'main' java.lang.NullPointerException: Не може да се прочете дължината на масива, защото '' е нула при ThrowNullExcep.main(ThrowNullExcep.java:7)- Извикване на метод с помощта на обекта, който има стойност Null.
Име на файл: ThrowNullExcep1.java
римски цифри 1-100
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(); } }
Изход:
Exception in thread 'main' java.lang.NullPointerException: Cannot invoke 'ThrowNullExcep1.foo()' because '' is null at ThrowNullExcep1.main(ThrowNullExcep1.java:13)
- Когато се опитате да синхронизирате върху NULL обект.
Име на файл: 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); } } }
Изход:
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)
- Вместо да хвърля стойност, се хвърля Null.
Име на файл: ThrowNullExcep3.java
char към цяло число 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; } }
Изход:
Exception in thread 'main' java.lang.NullPointerException: Cannot assign field 'a' because '' is null at ThrowExcep3.main(ThrowExcep3.java:10)
Изискване за NULL стойност
Null е специална стойност, която се използва в Java. Обикновено се използва, за да покаже, че няма стойност, която се присвоява на референтната променлива. Нулевата стойност се използва главно при внедряването на структури от данни като свързан списък или дърво. Използва се и в модела Singleton.
Избягване на NullPointerException
За да се избегне NullPointerException, трябва да се гарантира, че инициализирането на всички обекти е извършено правилно, преди да можете да ги използвате. Когато се декларира референтна променлива, трябва да се провери дали нулевата стойност не е присвоена на референцията, преди референтната стойност да се използва за достъп до полето или метода.
Наблюдавайте следните често срещани проблеми с решението.
Случай 1: Сравнение на низове с литерала
Един от често срещаните проблеми включва сравнението на литерал с низова променлива. Литералът може да бъде елемент от Enum или от String. Вместо да извиквате метода от нулевия обект, помислете за извикването му с помощта на литерала.
пролог език
Име на файл: 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.'); } } }
Изход:
NullPointerException has been caught.
Сега нека видим как човек може да го избегне.
Име на файл: NullPntrExcption1.java
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.'); } } }
Изход:
NullPointerException has been caught.
Случай 2: Следене на аргументите на метода
Първо трябва да се проверят аргументите на метода за нулевите стойности и след това да се премине към изпълнение на метода. В противен случай има добри шансове, че ще хвърли IllegalArgumentException и също ще сигнализира на извикващия метод, че не е наред с аргументите, които са били предадени.
java конвертира низ в цяло число
Име на файл: 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(); } }
Изход:
0 3 IllegalArgumentException has been caught. java.lang.IllegalArgumentException: The argument can never be null.
Случай 3: Използване на троичен оператор
Може също да се използва троичният оператор, за да се избегне NullPointerException. В троичния булевият израз се оценява първи. Ако изразът е оценен като верен, тогава се връща val1. В противен случай се връща val2.
Име на файл: 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); } }
Изход:
String is Null. javaTpoint