logo

Изключение за нулев указател в Java

NullPointerException в Java е RuntimeException. Това се случва, когато програма се опита да използва препратка към обект, която има нулева стойност. В Java 'null' е специална стойност, която може да бъде присвоена на препратки към обекти, за да покаже липсата на стойност.

Причини за изключение на нулев указател

NullPointerException възниква поради следните причини: 

  • Извикване на метод от нулев обект.
  • Достъп или модифициране на поле на нулев обект.
  • Вземане на дължината на null, сякаш е масив.
  • Достъп или модифициране на слотовете на нулеви обекти, сякаш са масив.
  • Изхвърляне на null, сякаш е Throwable стойност.
  • Когато се опитате да синхронизирате върху нулев обект.

Пример:



rhel срещу centos
Java
public class Geeks {    public static void main(String[] args) {    // Reference set to null  String s = null;     System.out.println(s.length());   } } 

Изход:

Hangup (SIGHUP)  
Exception in thread 'main' java.lang.NullPointerException
at Geeks.main(Geeks.java:10)

Обяснение: В този пример препратката към низ 's' е нула. Когато програмата се опита да извика метода length(), тя хвърля NullPointerException, защото няма реален обект.

какъв е размерът на екрана на моя монитор

Защо се използва null в Java?

Нулевата стойност служи като контейнер и показва, че не е присвоена стойност на референтна променлива. Често срещаните приложения включват:

  • Свързани структури от данни : Представлява края на списък или клон на дърво.
  • Дизайнерски модели : Това се използва в шаблони като модел на нулев обект или модел на единичен обект.

Как да избегнете NullPointerException

За да избегнем NullPointerException, трябва да гарантираме, че всички обекти са инициализирани правилно, преди да ги използваме. Когато декларираме референтна променлива, трябва да проверим дали обектът не е null, преди да поискаме метод или поле от обектите.

1. Използване на низови литерали в equals()

Много често срещан проблем включва сравнението между променлива String и литерал. Литералът може да бъде String или елемент от Enum. Вместо да извиквате метода от нулевия обект, помислете за извикването му от литерала. 

Пример:

Java
import java.io.*; class Geeks {  public static void main (String[] args) {    // Initializing String variable with null value  String s = null;  // Checking if s.equals null  try  {  // This line of code throws NullPointerException because s is null  if (s.equals('gfg'))  System.out.print('Same');  else   System.out.print('Not Same');  }  catch(NullPointerException e)  {  System.out.print('NullPointerException Caught');  }  } } 

Изход
NullPointerException Caught

Можем да избегнем NullPointerException, като извикаме равни на литерал, а не на обект.

Java
import java.io.*; class Geeks {  public static void main (String[] args) {    // Initializing String variable with null value  String s = null;  // Checking if s is null using try catch  try  {  if ('gfg'.equals(s))  System.out.print('Same');  else   System.out.print('Not Same');   }  catch(NullPointerException e)  {  System.out.print('Caught NullPointerException');  }  } } 

Изход
Not Same

Забележка : Винаги извиквайте равенства на литерала, за да избегнете извикване на метод на нулева препратка.

2. Проверка на аргументите на метода

Преди да изпълним тялото на новия метод, първо трябва да проверим неговите аргументи за нулеви стойности и да продължим с изпълнението на метода само когато аргументите са правилно проверени. В противен случай той ще хвърли IllegalArgumentException и ще уведоми извикващия метод, че нещо не е наред с предадените аргументи. 

равенство на низове в java

Пример:

Актьор Реха
Java
import java.io.*; class Geeks {  public static void main(String[] args) {    // String s set an empty string and calling getLength()  String s = '';    try {  System.out.println(getLength(s));  }  catch (IllegalArgumentException e) {  System.out.println(  'IllegalArgumentException caught');  }  // String s set to a value and calling getLength()  s = 'GeeksforGeeks';    try {  System.out.println(getLength(s));  }  catch (IllegalArgumentException e) {  System.out.println(  'IllegalArgumentException caught');  }  // Setting s as null and calling getLength()  s = null;    try {  System.out.println(getLength(s));  }  catch (IllegalArgumentException e) {  System.out.println(  'IllegalArgumentException caught');  }  }  public static int getLength(String s)  {  if (s == null)  throw new IllegalArgumentException(  'The argument cannot be null');    return s.length();  } } 

Изход
0 13 IllegalArgumentException caught 

3. Използвайте троичен оператор

Тернарният оператор може да се използва за избягване на NullPointerException. Първо се изчислява булевият израз. Ако изразът е верен, тогава се връща стойност1, в противен случай се връща стойност2. Можем да използваме троичния оператор за обработка на нулеви указатели.

Пример:

Java
import java.io.*; class Geeks {  public static void main(String[] args)  {  String s = null;  String m = (s == null) ? '' : s.substring(0 5);  System.out.println(m);  s = 'Geeksforgeeks';  m = (s == null) ? '' : s.substring(0 5);  System.out.println(m);  } } 

Изход
Geeks 

Обяснение : Троичният оператор помага при проверка за null и избягване на операции върху null препратки.

4. Използване на незадължителен клас (Java 8+)

В Java 8 Optional клас беше въведен като контейнерен обект, който може или не може да съдържа различна от нула стойност. Помага за избягване на NullPointerException като принуждава изрично да обработва случая, когато стойност липсва.

Пример:

Java
import java.util.Optional; public class OptionalExample {  public static void main(String[] args) {  Optional<String> name = Optional.ofNullable(null);  // Safe way to access  System.out.println(name.orElse('Default Name')); // prints: Default Name  } } 

Изход
Default Name 

Обяснение: Optional.ofNullable(value) обвива стойността, която може да е нула. orElse() осигурява резервен вариант, ако стойността не присъства.