У цьому підручнику ми збираємося вивчити виняток 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: неможливо прочитати довжину масиву, оскільки '' має значення null у ThrowNullExcep.main(ThrowNullExcep.java:7)- Виклик методу за допомогою об’єкта, який має значення Null.
Ім'я файлу: 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(); } }
Вихід:
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
Мультиплексор 2 до 1
// 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: Порівняння рядків з літералом
Однією з поширених проблем є порівняння літералу зі змінною String. Літерал може бути елементом з Enum або з String. Замість того, щоб викликати метод з нульового об’єкта, спробуйте викликати його за допомогою літералу.
java mvc
Ім'я файлу: 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, а також сповістить метод виклику про те, що він неправильний з переданими аргументами.
рахі савант
Ім'я файлу: 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