Ряд пользователей (да и разработчиков) программных продуктов на языке Java могут столкнуться с ошибкой java.lang.nullpointerexception (сокращённо NPE), при возникновении которой запущенная программа прекращает свою работу. Обычно это связано с некорректно написанным телом какой-либо программы на Java, требуя от разработчиков соответствующих действий для исправления проблемы. В этом материале я расскажу, что это за ошибка, какова её специфика, а также поясню, как исправить ошибку java.lang.nullpointerexception.
Содержание
- Что это за ошибка java.lang.nullpointerexception
- Как исправить ошибку java.lang.nullpointerexception
- Для пользователей
- Для разработчиков
- Заключение
Что это за ошибка java.lang.nullpointerexception
Появление данной ошибки знаменует собой ситуацию, при которой разработчик программы пытается вызвать метод по нулевой ссылке на объект. В тексте сообщения об ошибке система обычно указывает stack trace и номер строки, в которой возникла ошибка, по которым проблему будет легко отследить.
Что в отношении обычных пользователей, то появление ошибки java.lang.nullpointerexception у вас на ПК сигнализирует, что у вас что-то не так с функционалом пакетом Java на вашем компьютере, или что программа (или онлайн-приложение), работающие на Java, функционируют не совсем корректно. Если у вас возникает проблема, при которой Java апплет не загружен, рекомендую изучить материал по ссылке.
Как исправить ошибку java.lang.nullpointerexception
Как избавиться от ошибки java.lang.nullpointerexception? Способы борьбы с проблемой можно разделить на две основные группы – для пользователей и для разработчиков.
Для пользователей
Если вы встретились с данной ошибкой во время запуска (или работы) какой-либо программы (особенно это касается minecraft), то рекомендую выполнить следующее:
- Переустановите пакет Java на своём компьютере. Скачать пакет можно, к примеру, вот отсюда;
- Переустановите саму проблемную программу (или удалите проблемное обновление, если ошибка начала появляться после такового);
- Напишите письмо в техническую поддержку программы (или ресурса) с подробным описанием проблемы и ждите ответа, возможно, разработчики скоро пофиксят баг.
- Также, в случае проблем в работе игры Майнкрафт, некоторым пользователям помогло создание новой учётной записи с административными правами, и запуск игры от её имени.
Для разработчиков
Разработчикам стоит обратить внимание на следующее:
- Вызывайте методы equals(), а также equalsIgnoreCase() в известной строке литерала, и избегайте вызова данных методов у неизвестного объекта;
- Вместо toString() используйте valueOf() в ситуации, когда результат равнозначен;
- Применяйте null-безопасные библиотеки и методы;
- Старайтесь избегать возвращения null из метода, лучше возвращайте пустую коллекцию;
- Применяйте аннотации @Nullable и @NotNull;
- Не нужно лишней автоупаковки и автораспаковки в создаваемом вами коде, что приводит к созданию ненужных временных объектов;
- Регламентируйте границы на уровне СУБД;
- Правильно объявляйте соглашения о кодировании и выполняйте их.
Заключение
При устранении ошибки java.lang.nullpointerexception важно понимать, что данная проблема имеет программную основу, и мало коррелирует с ошибками ПК у обычного пользователя. В большинстве случаев необходимо непосредственное вмешательство разработчиков, способное исправить возникшую проблему и наладить работу программного продукта (или ресурса, на котором запущен сам продукт). В случае же, если ошибка возникла у обычного пользователя (довольно часто касается сбоев в работе игры Minecraft), рекомендуется установить свежий пакет Java на ПК, а также переустановить проблемную программу.
Опубликовано Обновлено
Когда вы объявляете переменную ссылочного типа, на самом деле вы создаете ссылку на объект данного типа. Рассмотрим следующий код для объявления переменной типа int:
int x;
x = 10;
В этом примере переменная x
имеет тип int
и Java инициализирует её как 0. Когда вы присвоите переменной значение 10 (вторая строка), это значение сохранится в ячейке памяти, на которую ссылается x
.
Но когда вы объявляете ссылочный тип, процесс выглядит иначе. Посмотрим на следующий код:
Integer num;
num = new Integer(10);
В первой строке объявлена переменная num
, ее тип не относится к встроенному, следовательно, значением является ссылка (тип этой переменной, Integer
, является ссылочным типом). Поскольку вы еще не указали, на что собираетесь ссылаться, Java присвоит переменной значение Null
, подразумевая «Я ни на что не ссылаюсь».
Во второй строке, ключевое слово new
используется для создания объекта типа Integer
. Этот объект имеет адрес в памяти, который присваивается переменной num
. Теперь, с помощью переменной num
вы можете обратиться к объекту используя оператора разыменования .
.
Исключение, о котором вы говорите в вопросе, возникает, если вы объявили переменную, но не создали объект, то есть если вы попытаетесь разыменовать num
до того, как создали объект, вы получите NullPointerException
. В самом простом случае, компилятор обнаружит проблему и сообщит, что
num
may not have been initialized
Что говорит: «возможно, переменная num
не инициализирована».
Иногда исключение вызвано именно тем, что объект действительно не был создан. К примеру, у вас может быть следующая функция:
public void doSomething(Integer num){
// Работаем с num
}
В этом случае создание объекта (переменная num
) лежит на вызывающем коде, то есть вы предполагаете, что он был создан ранее – до вызова метода doSomething
. К сожалению, следующий вызов метода вполне возможен:
doSomething(null);
В этом случае значение переменной num
будет null
. Лучшим способом избежать данного исключения будет проверка на равенство нулю. Как результат, функция doSomething
должна быть переписана следующим образом:
public void doSomething(Integer num){
if (num != null) {
// Работаем с num
}
}
Как альтернативный вариант предыдущему примеру вы можете сообщить вызывающему коду, что метод был вызван с неверными параметрами, например, с помощью IllegalArgumentException
.
public void doSomething(Integer num){
if (num == null)
throw new IllegalArgumentException("Num не должен быть null");
// Работаем с num
}
Также, обратите внимание на вопрос «Что такое stack trace и как с его помощью находить ошибки при разработке приложений?».
Перевод ответа «What is a Null Pointer Exception, and how do I fix it?» @Vincent Ramdhanie.
В этом посте я покажу наглядный пример того, как исправить ошибку исключения Null Pointer (java.lang.nullpointerexception). В Java особое значение null может быть назначено для ссылки на объект и означает, что объект в данный момент указывает неизвестную область данных.
NullPointerException появляется, если программа обращается или получает доступ к объекту, а ссылка на него равна нулю (null).
Это исключение возникает следующих случаях:
- Вызов метода из объекта значения null.
- Доступ или изменение объекта поля null.
- Принимает длину null(если бы это был массив Java).
- Доступ или изменение ячеек объекта null.
- Показывает «0», значение Throwable.
- При попытке синхронизации по нулевому объекту.
NullPointerException является RuntimeException, и, таким образом, компилятор Javac не заставляет вас использовать блок try-catch для соответствующей обработки.
Зачем нам нужно значение null?
Как уже упоминалось, null – это специальное значение, используемое в Java. Это чрезвычайно полезно при кодировании некоторых шаблонов проектирования, таких как Null Object pattern и шаблон Singleton pattern.
Шаблон Singleton обеспечивает создание только одного экземпляра класса, а также направлен на предоставление глобального доступа к объекту.
Например, простой способ создания не более одного экземпляра класса – объявить все его конструкторы как частные, а затем создать открытый метод, который возвращает уникальный экземпляр класса:
import java.util.UUID; class Singleton { private static Singleton single = null; private String ID = null; private Singleton() { /* Make it private, in order to prevent the creation of new instances of * the Singleton class. */ ID = UUID.randomUUID().toString(); // Create a random ID. } public static Singleton getInstance() { if (single == null) single = new Singleton(); return single; } public String getID() { return this.ID; } } public class TestSingleton { public static void main(String[] args) { Singleton s = Singleton.getInstance(); System.out.println(s.getID()); } }
В этом примере мы объявляем статический экземпляр класса Singleton. Этот экземпляр инициализируется не более одного раза внутри метода getInstance.
Обратите внимание на использование нулевого значения, которое разрешает создание уникального экземпляра.
Как избежать исключения Null Pointer
Чтобы решить и избежать исключения NullPointerException, убедитесь, что все ваши объекты инициализированы должным образом, прежде чем использовать их.
Когда вы объявляете ссылочную переменную, вы должны создать указатель на объект и убедиться, что указатель не является нулевым, прежде чем запрашивать метод или поле у объекта.
Кроме того, если выдается исключение, используйте информацию, находящуюся в трассировке стека исключения. Трассировка стека выполнения обеспечивается JVM, чтобы включить отладку. Найдите метод и строку, в которой было обнаружено исключение, а затем выясните, какая ссылка равна нулю в этой конкретной строке.
Опишем некоторые методы, которые имеют дело с вышеупомянутым исключением. Однако они не устраняют проблему, и программист всегда должен быть осторожен.
- Сравнение строк с литералами
Очень распространенный случай, выполнения программы включает сравнение между строковой переменной и литералом. Литерал может быть строкой или элементом Enum.
Вместо того, чтобы вызывать метод из нулевого объекта, рассмотрите возможность вызова его из литерала. Например:
String str = null; if(str.equals("Test")) { /* The code here will not be reached, as an exception will be thrown. */ }
Приведенный выше фрагмент кода вызовет исключение NullPointerException. Однако, если мы вызываем метод из литерала, поток выполнения продолжается нормально:
String str = null; if("Test".equals(str)) { /* Correct use case. No exception will be thrown. */ }
- Проверка аргументов метода
Перед выполнением вашего собственного метода обязательно проверьте его аргументы на наличие нулевых значений.
В противном случае вы можете вызвать исключение IllegalArgumentException.
Например:
public static int getLength(String s) { if (s == null) throw new IllegalArgumentException("The argument cannot be null"); return s.length(); }
- Предпочтение метода String.valueOf() вместо of toString()
Когда код вашей программы требует строковое представление объекта, избегайте использования метода toString объекта. Если ссылка вашего объекта равна нулю, генерируется исключение NullPointerException.
Вместо этого рассмотрите возможность использования статического метода String.valueOf, который не выдает никаких исключений и «ноль», если аргумент функции равен нулю.
- Используйте Ternary Operator
Ternary Operator – может быть очень полезным. Оператор имеет вид:
boolean expression ? value1 : value2;
Сначала вычисляется логическое выражение. Если выражение true, то возвращается значение1, в противном случае возвращается значение2. Мы можем использовать Ternary Operator для обработки нулевых указателей следующим образом:
String message = (str == null) ? "" : str.substring(0, 10);
Переменная message будет пустой, если ссылка str равна нулю. В противном случае, если str указывает на фактические данные, в сообщении будут первые 10 символов.
- создайте методы, которые возвращают пустые коллекции вместо нуля.
Очень хорошая техника – создавать методы, которые возвращают пустую коллекцию вместо нулевого значения. Код вашего приложения может перебирать пустую коллекцию и использовать ее методы и поля. Например:
public class Example { private static List<Integer> numbers = null; public static List<Integer> getList() { if (numbers == null) return Collections.emptyList(); else return numbers; } }
- Воспользуйтесь классом Apache’s StringUtils.
Apache’s Commons Lang – это библиотека, которая предоставляет вспомогательные утилиты для API java.lang, такие как методы манипулирования строками.
Примером класса, который обеспечивает манипулирование String, является StringUtils.java, который спокойно обрабатывает входные строки с нулевым значением.
Вы можете воспользоваться методами: StringUtils.isNotEmpty, StringUtils.IsEmpty и StringUtils.equals, чтобы избежать NullPointerException. Например:
if (StringUtils.isNotEmpty(str)) { System.out.println(str.toString()); }
- Используйте методы: contains(), containsKey(), containsValue()
Если в коде вашего приложения используется Maps, рассмотрите возможность использования методов contains, containsKey и containsValue. Например, получить значение определенного ключа после того, как вы проверили его существование на карте:
Map<String, String> map = … … String key = … String value = map.get(key); System.out.println(value.toString()); // An exception will be thrown, if the value is null.
System.out.println(value.toString()); // В приведенном выше фрагменте мы не проверяем, существует ли на самом деле ключ внутри карты, и поэтому возвращаемое значение может быть нулевым. Самый безопасный способ следующий:
Map<String, String> map = … … String key = … if(map.containsKey(key)) { String value = map.get(key); System.out.println(value.toString()); // No exception will be thrown. }
- Проверьте возвращаемое значение внешних методов
На практике очень часто используются внешние библиотеки. Эти библиотеки содержат методы, которые возвращают ссылку. Убедитесь, что возвращаемая ссылка не пуста.
- Используйте Утверждения
Утверждения очень полезны при тестировании вашего кода и могут использоваться, чтобы избежать выполнения фрагментов кода. Утверждения Java реализуются с помощью ключевого слова assert и выдают AssertionError.
Обратите внимание, что вы должны включить флажок подтверждения JVM, выполнив его с аргументом -ea. В противном случае утверждения будут полностью проигнорированы.
Примером использования утверждений Java является такая версия кода:
public static int getLength(String s) { /* Ensure that the String is not null. */ assert (s != null); return s.length(); }
Если вы выполните приведенный выше фрагмент кода и передадите пустой аргумент getLength, появится следующее сообщение об ошибке:
Exception in thread "main" java.lang.AssertionError
Также вы можете использовать класс Assert предоставленный средой тестирования jUnit.
- Модульные тесты
Модульные тесты могут быть чрезвычайно полезны при тестировании функциональности и правильности вашего кода. Уделите некоторое время написанию пары тестовых примеров, которые подтверждают, что исключение NullPointerException не возникает.
Существующие безопасные методы NullPointerException
Доступ к статическим членам или методам класса
Когда ваш вы пытаетесь получить доступ к статической переменной или методу класса, даже если ссылка на объект равна нулю, JVM не выдает исключение.
Это связано с тем, что компилятор Java хранит статические методы и поля в специальном месте во время процедуры компиляции. Статические поля и методы связаны не с объектами, а с именем класса.
class SampleClass { public static void printMessage() { System.out.println("Hello from Java Code Geeks!"); } } public class TestStatic { public static void main(String[] args) { SampleClass sc = null; sc.printMessage(); } }
Несмотря на тот факт, что экземпляр SampleClass равен нулю, метод будет выполнен правильно. Однако, когда речь идет о статических методах или полях, лучше обращаться к ним статическим способом, например, SampleClass.printMessage ().
Оператор instanceof
Оператор instanceof может использоваться, даже если ссылка на объект равна нулю.
Оператор instanceof возвращает false, когда ссылка равна нулю.
String str = null; if(str instanceof String) System.out.println("It's an instance of the String class!"); else System.out.println("Not an instance of the String class!");
В результате, как и ожидалось:
Not an instance of the String class!
Смотрите видео, чтобы стало понятнее.
The error 500: Java.lang.nullpointerexception is an error that is faced by some developers when executing their code. Moreover, end-users also encounter the error 500 when launching an application/game or accessing a particular website. Usually, the following type of error message is shown:
Due to the diversity of the coding world and tools used, it is not possible to cover those in this article but for a developer, the issue is either caused by an error in the code (like calling a function before its initializing) or a server-side error (like using doPost() when doGet() was required). If that is not the case, then reinstalling IDE (as discussed later) may clear the error for a developer.
For an end-user, if the issue is not on the server-side, then the following can be considered as the main factors leading to the error 500:
- Incompatible Browser: If a user is encountering the lang.nullpointerexception when accessing a particular website, then that browser’s incompatibility (like Edge) with that website may cause the error 500 as the website fails to call the function essential for its operations.
- Outdated Java Version on the System: If the system’s Java version is outdated, then its incompatibility with the game, application, or website might cause the error at hand as the Java modules of the system may fail to load.
- Interference from the System’s Firewall: If the system’s firewall is blocking the execution of Java (as a false positive), then the non-execution of the Java modules of the game, application, or website may lead to the error 500.
- Corrupt Installation of the Game or Java: If the game or Java’s installation is corrupt, then the essential game or Java modules may fail to operate and that may result in an error message.
Try Another Browser
If a particular website is failing to load in a browser with ‘Java.lang.nullpointerexception’, then that particular browser’s incompatibility with the website could be the root cause of the error 500 as the website may fail to perform a particular operation, which may be essential for the website’s functionality. Here, trying another browser may clear the error.
- Download and install another browser on your device/system (if already not present).
- Now launch the other browser (like Chrome or Firefox) and steer to the problematic website to check if it is operating fine.
- If not, check if clean booting of the system (especially, any Comcast-related applications) clears the error 500.
If the issue persists, check if the problematic website can be opened on another device (preferably, using another network).
Install Java on the System
Java is available for nearly every platform like smartphones. Windows PCs, Macs, Linux distros, etc. If the problematic application/game (like Minecraft) or website requires Java on a user’s system but is not installed on that system, then that can cause the error message as Java is not available for the execution of the related modules. Here, installing Java on the user’s system may solve the problem.
- Launch a web browser and head to the Java website to download Java.
- Now click on the Agree and Start Free Download.
Download Java - Then select the download as per the OS and system. Keep in mind if the problematic application, game, or website uses a particular version of Java, then make sure to download the required version.
- Afterward, wait till the Java download completes.
- Once downloaded, close all browser windows and any other running applications.
- Now right-click on the downloaded installer of Java and select Run as Administrator.
- Then follow the prompts on the screen to install Java and once done, restart your system.
- Upon restart, set up the Java installation as per the (if any) requirements of the problematic application, game, or website (like Environmental Variable, etc.).
- Now launch the problematic application, game, or website (in a browser) and check the issue is solved.
Update the System’s Java Version to the Latest Build
If the Java version on the system is outdated, it may cause incompatibility with the problematic website or application. Due to this incompatibility, certain Java-related modules may fail to execute properly and cause error 500. Here, updating the Java version of the system to the latest build may solve the problem.
- Press the Windows key and search for Java.
Open Configure Java - Then in the search results, open Configure Java and head to the Update tab.
Click Update Java in the Update Tab - Now click on the Update Now button and wait till the update process completes.
- Once done, restart your system and upon restart, check if the Java.Lang.NullPointerException issue is cleared.
Disable the System’s Firewall
You may encounter this error message if the system’s firewall is blocking the execution of certain Java modules as the blocked Java modules may fail to execute. In this case, disabling the system’s firewall may clear the error 500. For illustration, we will discuss the process of disabling ESET.
Warning:
Proceed at your own risk as disabling the system’s firewall may expose the system, network, and data to threats.
- Right-click on ESET in the hidden icons of the system’s tray and click on Pause Protection.
Pause ESET Protection and Firewall - Then click Yes (if a UAC prompt is shown) and afterward, select the time interval (like 1 hour) for which you want to disable the firewall.
- Now click on Apply and again, right-click on ESET.
- Then select Pause Firewall and afterward, confirm to disable ESET firewall.
- Now check if the system is clear of the error 500.
Reinstall IDE or Code Editor on the System
For a developer, if none of the code or server-side issues are causing the error message, then the corrupt installation of the IDE (like Adobe ColdFusion) or code editor could be the root cause of the issue.
Here, reinstalling the IDE or code editor may clear the error at hand. For illustration, we will discuss the process of reinstalling Adobe ColdFusion on a Windows PC. Before proceeding, make sure to back up essential code snippets or other data.
- Firstly, check if using the default skin or theme (like metallic) of the IDE or Code Editor (like SNAP editor) clears the error.
- If not, right-click Windows and open Apps & Features.
Open Apps & Features - Now expand the Adobe ColdFusion option and select Uninstall.
Uninstall Adobe ColdFusion - Then confirm to uninstall the Adobe ColdFusion and follow the prompts on the screen to uninstall it.
- Once done, restart your system and upon restart, right-click Windows.
- Now select Run and then delete the ColdFusion remnants from the following directories:
temp %temp% %ProgramData% \Program Files \Program Files (x86) appdata
Open the ProgramData Folder - Then reinstall Adobe ColdFusion and check if the error 500 is cleared.
Reinstall the Problematic Game
You may encounter the ‘error 500:Java.lang.nullpointerexception’ on a Java-based game (like Minecraft) if the game’s installation is corrupt as the game’s modules are not able to perform the designated role. In this scenario, reinstalling the problematic game may clear the error at hand. For elucidation, we will discuss the process of reinstalling Minecraft.
- Right-click Windows and open Run.
Open the Run Command Box from the Quick Access Menu - Now navigate to the following:
%appdata%
- Now open the .Minecraft folder and backup the Saves folder (to save the worlds you have been playing).
Copy the Saves Folder to the Minecraft - Then click Windows and search for Minecraft.
- Now right-click on it and select Uninstall.
Uninstall Minecraft - Then confirm to uninstall Minecraft and follow the prompts on the screen to uninstall the game.
- Once uninstalled, reboot your system and upon reboot, steer to the following path in Run:
%appdata%
- Then delete the .Minecraft folder and afterward, steer to the following path in Run:
AppData
Delete the Minecraft Folder in the Roaming Directory - Then delete all the Minecraft-related folders from all of the three following directories:
Local LocalLow Roaming
- Now reinstall Minecraft by using the official Minecraft installer and once reinstalled, check if the game is clear of the error 500.
Reinstall Java on the System
If the Java’s installation on your system itself is corrupt, then that can also be the cause of the issue as many of the Java libraries may not be available to the problematic game, application, or website. In this scenario, reinstalling Java on your system may clear the error 500. For illustration, we will discuss the process of reinstalling Java on a Windows system.
- Right-click Windows and open Apps & Features.
- Now expand the Java option and click on Uninstall.
Uninstall Java 64-bit Version - Then confirm to uninstall Java and follow the prompts on the screen to uninstall Java.
- Once uninstalled, restart your system, and upon restart, open the Run command box by pressing Windows + R keys.
- Now delete the Java remnants from the following paths:
C:\Program Files\Java\ C:\ProgramData\Oracle\Java C:\Program Files (x86)\Common Files\Java C:\Program Files (x86)\Oracle\Java \ProgramData AppData temp %temp%
- Afterward, disable the system’s firewall (as discussed earlier) and reinstall the latest Java version (or the Java version required by the game, application, or website).
- Once reinstalled, restart your system and upon restart, hopefully, the system would be cleared of the error 500:Java.lang.nullpointerexception.
- If not, check if copying the msvcr71.dll file (from another working computer) to the following path clears the error (if the issue is occurring in a browser):
C:\windows\system32
If the issue persists and occurs with a particular website, application, or game, then you may contact support to check the backend for any server-side issues.
Kevin Arrows
Kevin Arrows is a highly experienced and knowledgeable technology specialist with over a decade of industry experience. He holds a Microsoft Certified Technology Specialist (MCTS) certification and has a deep passion for staying up-to-date on the latest tech developments. Kevin has written extensively on a wide range of tech-related topics, showcasing his expertise and knowledge in areas such as software development, cybersecurity, and cloud computing. His contributions to the tech field have been widely recognized and respected by his peers, and he is highly regarded for his ability to explain complex technical concepts in a clear and concise manner.
Довольно часто при разработке на Java программисты сталкиваются с NullPointerException, появляющимся в самых неожиданных местах. В этой статье мы разберёмся, как это исправить и как стараться избегать появления NPE в будущем.
NullPointerException (оно же NPE) это исключение, которое выбрасывается каждый раз, когда вы обращаетесь к методу или полю объекта по ссылке, которая равна null. Разберём простой пример:
Integer n1 = null; System.out.println(n1.toString());
Здесь на первой строке мы объявили переменную типа Integer и присвоили ей значение null (то есть переменная не указывает ни на какой существующий объект).
На второй строке мы обращаемся к методу toString переменной n1. Так как переменная равна null, метод не может выполниться (переменная не указывает ни на какой реальный объект), генерируется исключение NullPointerException:
Exception in thread "main" java.lang.NullPointerException at ru.javalessons.errors.NPEExample.main(NPEExample.java:6)
Как исправить NullPointerException
В нашем простейшем примере мы можем исправить NPE, присвоив переменной n1 какой-либо объект (то есть не null):
Integer n1 = 16; System.out.println(n1.toString());
Теперь не будет исключения при доступе к методу toString и наша программа отработает корректно.
Если ваша программа упала из-за исключение NullPointerException (или вы перехватили его где-либо), вам нужно определить по стектрейсу, какая строка исходного кода стала причиной появления этого исключения. Иногда причина локализуется и исправляется очень быстро, в нетривиальных случаях вам нужно определять, где ранее по коду присваивается значение null.
Иногда вам требуется использовать отладку и пошагово проходить программу, чтобы определить источник NPE.
Как избегать исключения NullPointerException
Существует множество техник и инструментов для того, чтобы избегать появления NullPointerException. Рассмотрим наиболее популярные из них.
Проверяйте на null все объекты, которые создаются не вами
Если объект создаётся не вами, иногда его стоит проверять на null, чтобы избегать ситуаций с NullPinterException. Здесь главное определить для себя рамки, в которых объект считается «корректным» и ещё «некорректным» (то есть невалидированным).
Не верьте входящим данным
Если вы получаете на вход данные из чужого источника (ответ из какого-то внешнего сервиса, чтение из файла, ввод данных пользователем), не верьте этим данным. Этот принцип применяется более широко, чем просто выявление ошибок NPE, но выявлять NPE на этом этапе можно и нужно. Проверяйте объекты на null. В более широком смысле проверяйте данные на корректность, и консистентность.
Возвращайте существующие объекты, а не null
Если вы создаёте метод, который возвращает коллекцию объектов – не возвращайте null, возвращайте пустую коллекцию. Если вы возвращаете один объект – иногда удобно пользоваться классом Optional (появился в Java 8).
Заключение
В этой статье мы рассказали, как исправлять ситуации с NullPointerException и как эффективно предотвращать такие ситуации при разработке программ.