ява.ланг.Исключение NullPointerException является наиболее распространенным исключением в Java. Давайте рассмотрим примеры исключений NullPointerException, как их обнаружить и исправить.
ява.ланг.Исключение NullPointerException-одно из самых популярных исключений в программировании на Java. Любой, кто работает на java, должен был видеть, как это появляется из ниоткуда в автономной программе java, а также в веб-приложении java .
ява.ланг.Исключение NullPointerException-одно из самых популярных исключений в программировании на Java. Любой, кто работает на java, должен был видеть, как это появляется из ниоткуда в автономной программе java, а также в веб-приложении java .
Исключение NullPointerException является исключением во время выполнения, поэтому нам не нужно перехватывать его в программе. Исключение NullPointerException возникает в приложении, когда мы пытаемся выполнить какую-либо операцию над null , где требуется объект. Некоторые из распространенных причин исключения NullPointerException в программах Java являются:
How To Fix Minecraft java.lang.NullPointerException [Very EASY!]
- Вызов метода в экземпляре объекта, но во время выполнения объект равен нулю.
- Доступ к переменным экземпляра объекта, который является нулевым во время выполнения.
- Выбрасывание null в программе
- Доступ к индексу или изменение значения индекса массива, который равен нулю
- Проверка длины массива, который является нулевым во время выполнения.
Примеры исключений NullPointerException Java
Давайте рассмотрим некоторые примеры исключения NullPointerException в программах java.
1. Исключение NullPointerException при вызове метода экземпляра
public class Temp < public static void main(String[] args) < Temp t = initT(); t.foo(«Hi»); >private static Temp initT() < return null; >public void foo(String s) < System.out.println(s.toLowerCase()); >>
Когда мы запускаем вышеуказанную программу, она выдает следующее сообщение об ошибке NullPointerException.
Exception in thread «main» java.lang.NullPointerException at Temp.main(Temp.java:7)
Мы получаем исключение NullPointerException в операторе t.foo(«Привет»); потому что “t” здесь равно нулю.
2. Исключение Java NullPointerException при доступе/изменении поля нулевого объекта
public class Temp < public int x = 10; public static void main(String[] args) < Temp t = initT(); int i = t.x; >private static Temp initT() < return null; >>
Приведенная выше программа выдает следующую трассировку стека исключений NullPointerException.
Exception in thread «main» java.lang.NullPointerException at Temp.main(Temp.java:9)
Исключение NullPointerException создается в операторе int.x; , потому что “t” здесь равно нулю.
3. Исключение Java NullPointerException при передаче значения null в аргументе метода
public class Temp < public static void main(String[] args) < foo(null); >public static void foo(String s) < System.out.println(s.toLowerCase()); >>
Это одно из наиболее распространенных случаев использования java.lang.Исключение NullPointerException потому что вызывающий объект передает аргумент null.
como solucionar el error de java.lang.NullPointerException
На приведенном ниже рисунке показано исключение нулевого указателя, когда вышеуказанная программа выполняется в среде IDE Eclipse.
4. java.язык.Исключение NullPointerException, когда выбрасывается значение null
public class Temp < public static void main(String[] args) < throw null; >>
Ниже приведена трассировка стека исключений вышеупомянутой программы, показывающая исключение NullPointerException из-за оператора throw null; .
Exception in thread «main» java.lang.NullPointerException at Temp.main(Temp.java:5)
5. Исключение NullPointerException при получении длины массива null
public class Temp < public static void main(String[] args) < int[] data = null; int len = data.length; >>
Exception in thread «main» java.lang.NullPointerException at Temp.main(Temp.java:7)
6. Исключение NullPointerException при доступе к значению индекса нулевого массива
public class Temp < public static void main(String[] args) < int[] data = null; int len = data[2]; >>
Exception in thread «main» java.lang.NullPointerException at Temp.main(Temp.java:7)
7. Исключение NullPointerException при синхронизации с нулевым объектом
public class Temp < public static String mutex = null; public static void main(String[] args) < synchronized(mutex) < System.out.println(«synchronized block»); >> >
synchronized(мьютекс) вызовет исключение NullPointerException, поскольку объект “мьютекс” равен нулю.
8. Статус HTTP 500 java.lang.Исключение NullPointerException
Иногда мы получаем ответ на страницу с ошибкой от веб – приложения java с сообщением об ошибке “HTTP Status 500-Внутренняя ошибка сервера” и основной причиной как java.lang.Исключение NullPointerException .
Для этого я отредактировал пример проекта Spring MVC и изменил метод HomeController, как показано ниже.
На рисунке ниже показано сообщение об ошибке, вызванное ответом веб – приложения.
Вот трассировка стека исключений:
HTTP Status 500 – Internal Server Error Type Exception Report Message Request processing failed; nested exception is java.lang.NullPointerException Description The server encountered an unexpected condition that prevented it from fulfilling the request. Exception org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) javax.servlet.http.HttpServlet.service(HttpServlet.java:661) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) Root Cause java.lang.NullPointerException com.journaldev.spring.controller.HomeController.user(HomeController.java:38) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498)
Основной причиной является исключение NullPointerException в инструкции user.getUserId().toLowerCase() потому что user.getUserId() возвращает значение null.
Как определить java.lang.Исключение NullPointerException
Обнаружить исключение NullPointerException очень просто, просто посмотрите на трассировку исключений, и она покажет вам имя класса и номер строки исключения. Затем посмотрите на код и посмотрите, что может быть null, вызывающим исключение NullPointerException. Просто посмотрите на все вышеприведенные примеры, из трассировки стека очень ясно, что вызывает исключение nullpointerexception.
Как исправить исключение NullPointerException
ява.ланг.Исключение NullPointerException является непроверенным исключением, поэтому нам не нужно его ловить. Исключения нулевого указателя можно предотвратить с помощью проверок на нуль и методов превентивного кодирования. Посмотрите на приведенные ниже примеры кода, показывающие, как избежать java.lang.Исключение NullPointerException .
if(mutex ==null) mutex =»»; //preventive coding synchronized(mutex)
//using null checks if(user!=null user.getUserName() !=null) < System.out.println(«User Name: «+user.getUserName().toLowerCase()); >if(user!=null user.getUserName() !=null)
Рекомендации по кодированию, чтобы избежать исключения NullPointerException
1. Давайте рассмотрим приведенную ниже функцию и рассмотрим сценарий, вызывающий исключение нулевого указателя.
public void foo(String s) < if(s.equals(«Test»)) < System.out.println(«test»); >>
Исключение NullPointerException может возникнуть, если аргумент передается как null. Тот же метод можно записать, как показано ниже, чтобы избежать исключения NullPointerException.
public void foo(String s) < if («Test».equals(s)) < System.out.println(«test»); >>
2. Мы также можем добавить нулевую проверку аргумента и выбросить Исключение IllegalArgumentException при необходимости.
public int getArrayLength(Object[] array)
3. Мы можем использовать тернарный оператор, как показано в приведенном ниже примере кода.
String msg = (str == null) ? «» : str.substring(0, str.length()-1);
4. Используйте метод String.valueOf() вместо метода toString () . Например, проверьте, что код метода PrintStream println() определен следующим образом.
public void println(Object x) < String s = String.valueOf(x); synchronized (this) < print(s); newLine(); >>
Приведенный ниже фрагмент кода показывает пример, в котором метод valueOf() используется вместо toString().
Object mutex = null; //prints null System.out.println(String.valueOf(mutex)); //will throw java.lang.NullPointerException System.out.println(mutex.toString());
5. Напишите методы, возвращающие пустые объекты, а не пустые, где это возможно, например, пустой список, пустую строку и т. Д.
6. В классах коллекций определены некоторые методы, чтобы избежать исключения NullPointerException, вы должны их использовать. Например, содержит(), содержит () и содержит значение().
Читайте ещё по теме:
- Метки exception, fix, nullpointerexception
Источник: javascopes.com
Что такое исключение нулевого указателя в Java
- Что такое NullPointerException в Java?
- Обработка класса NullPointerException в Java
- Обработка класса NullPointerException в Java
- Встречи с NullPointerException в аргументах командной строки в Java
В этом руководстве рассказывается об исключении нулевого указателя Java и о том, как с ним справиться. Мы включили несколько примеров программ, которым вы можете следовать.
Wie kannst du schnell eine Reihe vo.
Please enable JavaScript
В Java значение по умолчанию для любой ссылочной переменной — это нулевое значение, указывающее на ячейку памяти, но не имеющее связанного значения. Когда программист пытается выполнить какую-либо операцию с этой ссылочной переменной, он генерирует исключение нулевого указателя из-за нулевых условий.
- Вызов метода экземпляра нулевого объекта.
- Изменение поля нулевого объекта.
- Обработка длины нуля, как если бы это был массив.
Для обработки этого исключения Java предоставляет класс NullPointerException , расположенный в пакете java.lang . Мы можем использовать этот класс в блоке catch , чтобы указать тип исключения, а затем перехватить его, чтобы избежать нарушения кода.
Что такое NullPointerException в Java?
Самый простой пример для понимания класса NullPointerException — это создание string объекта, а затем применение такого метода, как toUpperCase() , для преобразования строки в верхний регистр. Посмотрите на пример ниже и обратите внимание, что он вызывает исключение, потому что объект string пуст:
public class SimpleTesting static String str; public static void main(String[] args) String newStr = str.toUpperCase(); System.
out.println(newStr); > >
Exception in thread «main» java.lang.NullPointerException
Обработка класса NullPointerException в Java
Для обработки исключений Java предоставляет блок try-catch.
Здесь мы можем использовать эти блоки, чтобы поймать NullPointerException и избежать аварийного завершения программы. Посмотрите пример ниже:
public class SimpleTesting static String str; public static void main(String[] args) try String newStr = str.toUpperCase(); System.
out.println(newStr); >catch(NullPointerException e) System.out.
println(«Null Pointer: «+e.getMessage()); > > >
Обработка класса NullPointerException в Java
Если вы уже знаете о пустой ссылке, вы можете использовать блок if-else для проверки переменной перед применением любой операции. Этот метод — отличное решение, но он работает только в том случае, если вы заранее знаете нулевую ссылку. Смотрите код здесь:
public class SimpleTesting static String str; public static void main(String[] args) if(str != null) String newStr = str.toUpperCase(); System.
out.println(newStr); >else System.out.
println(«String is null»); > >
String is null
Встречи с NullPointerException в аргументах командной строки в Java
Это еще один сценарий, при котором может возникнуть исключение нулевого указателя. Массив args[] метода main() содержит аргументы командной строки, и если во время выполнения аргумент не указан, то он указывает на пустую ссылку. Получение его длины вернет NullPointerException . См. Пример ниже:
public class SimpleTesting static String[] arr; public static void main(String[] args) int length = arr.length; System.
out.println(«Array length : «+length); > >
Exception in thread «main» java.lang.NullPointerException
Сопутствующая статья — Java Exception
- Поймать множественные исключения в Java
report this ad
- О нас
- Политика конфиденциальности
- контакт
Источник: www.delftstack.com
Как понять NullPointerException
Эта простая статья скорее для начинающих разработчиков Java, хотя я нередко вижу и опытных коллег, которые беспомощно глядят на stack trace, сообщающий о NullPointerException (сокращённо NPE), и не могут сделать никаких выводов без отладчика. Разумеется, до NPE своё приложение лучше не доводить: вам помогут null-аннотации, валидация входных параметров и другие способы. Но когда пациент уже болен, надо его лечить, а не капать на мозги, что он ходил зимой без шапки.
- Его кинули с помощью throw
- Кто-то кинул null с помощью throw
- Кто-то пытается обратиться по null-ссылке
- Вызов нестатического метода класса
- Обращение (чтение или запись) к нестатическому полю
- Обращение (чтение или запись) к элементу массива
- Чтение length у массива
- Неявный вызов метода valueOf при анбоксинге (unboxing)
Рассмотрим такой код:
1: class Data < 2: private String val; 3: public Data(String val) 4: public String getValue() 5: > 6: 7: class Formatter < 8: public static String format(String value) < 9: return value.trim(); 10: >11: > 12: 13: public class TestNPE < 14: public static String handle(Formatter f, Data d) < 15: return f.format(d.getValue()); 16: >17: >
Откуда-то был вызван метод handle с какими-то параметрами, и вы получили:
Exception in thread «main» java.lang.NullPointerException at TestNPE.handle(TestNPE.java:15)
В чём причина исключения — в f, d или d.val? Нетрудно заметить, что f в этой строке вообще не читается, так как метод format статический. Конечно, обращаться к статическому методу через экземпляр класса плохо, но такой код встречается (мог, например, появиться после рефакторинга). Так или иначе значение f не может быть причиной исключения.
Если бы d был не null, а d.val — null, тогда бы исключение возникло уже внутри метода format (в девятой строчке). Аналогично проблема не могла быть внутри метода getValue, даже если бы он был сложнее. Раз исключение в пятнадцатой строчке, остаётся одна возможная причина: null в параметре d.
Вот другой пример:
1: class Formatter < 2: public String format(String value) < 3: return «[«+value+»]»; 4: >5: > 6: 7: public class TestNPE < 8: public static String handle(Formatter f, String s) < 9: if(s.isEmpty()) < 10: return «(none)»; 11: >12: return f.format(s.trim()); 13: > 14: >
Снова вызываем метод handle и получаем
Exception in thread «main» java.lang.NullPointerException at TestNPE.handle(TestNPE.java:12)
Теперь метод format нестатический, и f вполне может быть источником ошибки. Зато s не может быть ни под каким соусом: в девятой строке уже было обращение к s. Если бы s было null, исключение бы случилось в девятой строке. Просмотр логики кода перед исключением довольно часто помогает отбросить некоторые варианты.
С логикой, конечно, надо быть внимательным. Предположим, условие в девятой строчке было бы написано так:
if(«».equals(s))
Теперь в самой строчке обращения к полям и методам s нету, а метод equals корректно обрабатывает null, возвращая false, поэтому в таком случае ошибку в двенадцатой строке мог вызвать как f, так и s. Анализируя вышестоящий код, уточняйте в документации или исходниках, как используемые методы и конструкции реагируют на null. Оператор конкатенации строк +, к примеру, никогда не вызывает NPE.
Вот такой код (здесь может играть роль версия Java, я использую Oracle JDK 1.7.0.45):
1: import java.io.PrintWriter; 2: 3: public class TestNPE < 4: public static void dump(PrintWriter pw, MyObject obj) < 5: pw.print(obj); 6: >7: >
Вызываем метод dump, получаем такое исключение:
Exception in thread «main» java.lang.NullPointerException at java.io.PrintWriter.write(PrintWriter.java:473) at java.io.PrintWriter.print(PrintWriter.java:617) at TestNPE.dump(TestNPE.java:5)
В параметре pw не может быть null, иначе нам не удалось бы войти в метод print. Возможно, null в obj? Легко проверить, что pw.print(null) выводит строку «null» без всяких исключений. Пойдём с конца. Исключение случилось здесь:
472: public void write(String s)
В строке 473 возможна только одна причина NPE: обращение к методу length строки s. Значит, s содержит null. Как так могло получиться? Поднимемся по стеку выше:
616: public void print(Object obj)
В метод write передаётся результат вызова метода String.valueOf. В каком случае он может вернуть null?
public static String valueOf(Object obj)
Единственный возможный вариант — obj не null, но obj.toString() вернул null. Значит, ошибку надо искать в переопределённом методе toString() нашего объекта MyObject. Заметьте, в stack trace MyObject вообще не фигурировал, но проблема именно там. Такой несложный анализ может сэкономить кучу времени на попытки воспроизвести ситуацию в отладчике.
Не стоит забывать и про коварный автобоксинг. Пусть у нас такой код:
1: public class TestNPE < 2: public static int getCount(MyContainer obj) < 3: return obj.getCount(); 4: >5: >
И такое исключение:
Exception in thread «main» java.lang.NullPointerException at TestNPE.getCount(TestNPE.java:3)
На первый взгляд единственный вариант — это null в параметре obj. Но следует взглянуть на класс MyContainer:
import java.util.List; public class MyContainer < Listelements; public MyContainer(List elements) < this.elements = elements; >public Integer getCount() < return elements == null ? null : elements.size(); >>
Мы видим, что getCount() возвращает Integer, который автоматически превращается в int именно в третьей строке TestNPE.java, а значит, если getCount() вернул null, произойдёт именно такое исключение, которое мы видим. Обнаружив класс, подобный классу MyContainer, посмотрите в истории системы контроля версий, кто его автор, и насыпьте ему крошек под одеяло.
Помните, что если метод принимает параметр int, а вы передаёте Integer null, то анбоксинг случится до вызова метода, поэтому NPE будет указывать на строку с вызовом.
В заключение хочется пожелать пореже запускать отладчик: после некоторой тренировки анализ кода в голове нередко выполняется быстрее, чем воспроизведение трудноуловимой ситуации.
- nullpointerexception
- npe
- отладка
- диагностика
- exception
- прошитый в мозг отладчик
Источник: habr.com