logo

Изузетак Нулл Поинтер у Јави

У овом водичу ћемо научити изузетак Нулл показивача у Јави. Изузетак нулти показивача је изузетак времена извођења. Нулл је посебна врста вредности која се може доделити референци објекта. Кад год неко покуша да користи референцу која има вредност Нулл, подиже се изузетак НуллПоинтерЕкцептион.

Различити сценарији за изузетак Нулл Поинтер

Посматрајте неке од следећих сценарија у којима се НуллПоинтерЕкцептион може покренути.

  • Израчунавање величине или дужине Нулл као да је низ елемената.

Назив документа: ТхровНуллЕкцеп.јава

 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); } } 

Излаз:

Изузетак у 'маин' нити јава.ланг.НуллПоинтерЕкцептион: Не могу да прочитам дужину низа јер је '' нулл на ТхровНуллЕкцеп.маин(ТхровНуллЕкцеп.јава:7)
  • Позивање методе помоћу објекта који има вредност Нулл.

Назив документа: ТхровНуллЕкцеп1.јава

 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) 
  • Када покушате да извршите синхронизацију преко НУЛЛ објекта.

Назив документа: ТхровНуллЕкцеп2.јава

 // 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) 
  • Уместо бацања вредности, избацује се Нулл.

Назив документа: ТхровНуллЕкцеп3.јава

 // 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) 

Захтев НУЛЛ вредности

Нулл је посебна вредност која се користи у Јави. Обично се користи да покаже да не постоји вредност која се додељује референтној променљивој. Нулл вредност се углавном користи у имплементацији структура података као што су повезана листа или стабло. Такође се користи у обрасцу Синглетон.

Избегавање НуллПоинтерЕкцептион

Да би се избегао НуллПоинтерЕкцептион, требало би да се увери да је иницијализација свих објеката урађена како треба пре него што се може користити. Када неко декларише референтну променљиву, требало би да провери да ли нулта вредност није додељена референци пре него што се референтна вредност користи за приступ пољу или методу.

Обратите пажњу на следеће уобичајене проблеме са решењем.

Случај 1: Поређење низова са литералом

Један од уобичајених проблема укључује поређење литерала са стринг променљивом. Литерал може бити елемент из енума или из стринга. Уместо позивања методе из нултог објекта, размислите о томе да га позовете помоћу литерала.

Назив документа: НуллПнтрЕкцптион.јава

 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. 

Сада, да видимо како се то може избећи.

Назив документа: НуллПнтрЕкцптион1.јава

 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: Пазите на аргументе метода

Мора се прво проверити аргументе методе за нулте вредности, а затим кренути са извршењем методе. У супротном, постоје велике шансе да ће избацити изузетак ИллегалАргументЕкцептион и такође ће сигнализирати методу позивања да није у реду са аргументима који су прослеђени.

Назив документа: НуллПнтрЕкцптион2.јава

 // 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: Коришћење тернарног оператера

Такође се може користити тернарни оператор да би се избегао НуллПоинтерЕкцептион. У тернарном, Булов израз се прво вреднује. Ако је израз процењен као тачан, онда се враћа вредност вал1. У супротном, вал2 се враћа.

Назив документа: НуллПнтрЕкцптион3.јава

јава низ
 // 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