NullPointerException в Java е RuntimeException. Това се случва, когато програма се опита да използва препратка към обект, която има нулева стойност. В Java 'null' е специална стойност, която може да бъде присвоена на препратки към обекти, за да покаже липсата на стойност.
Причини за изключение на нулев указател
NullPointerException възниква поради следните причини:
- Извикване на метод от нулев обект.
- Достъп или модифициране на поле на нулев обект.
- Вземане на дължината на null, сякаш е масив.
- Достъп или модифициране на слотовете на нулеви обекти, сякаш са масив.
- Изхвърляне на null, сякаш е Throwable стойност.
- Когато се опитате да синхронизирате върху нулев обект.
Пример:
rhel срещу centosJava
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. Вместо да извиквате метода от нулевия обект, помислете за извикването му от литерала.
Пример:
Javaimport 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, като извикаме равни на литерал, а не на обект.
Javaimport 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. Можем да използваме троичния оператор за обработка на нулеви указатели.
Пример:
Javaimport 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 като принуждава изрично да обработва случая, когато стойност липсва.
Пример:
Javaimport 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() осигурява резервен вариант, ако стойността не присъства.