java.lang.NullPointerException – это одно из самых распространенных исключений в Java программировании. Любой, кто работает в Java, наверняка видел это исключение, которое появляется из ниоткуда в Java standalone программе, так и в веб-приложении Java.
java.lang.NullPointerException
NullPointerException – это исключение времени выполнения, поэтому нам не нужно его перехватывать в программе. NullPointerException возникает в приложении, когда мы пытаемся выполнить какую-либо операцию на null, где требуется объект. Некоторые из общих причин для NullPointerException в Java программы:
- Вызов метода на экземпляре объекта, но во время выполнения объект равен null.
- Доступ к переменным экземпляра объекта, который во время выполнения равен null.
- Выбрасывание null в программе
- Доступ к индексу или изменение значения индекса массива, который равен null
- Проверка длины массива, который во время выполнения равен null.
Примеры NullPointerException в Java
Давайте рассмотрим несколько примеров NullPointerException в программах на Java.
1. NullPointerException при вызове метода экземпляра
При выполнении вышеуказанной программы возникает следующее сообщение об ошибке NullPointerException.
Мы получаем NullPointerException в выражении t.foo("Hi");
, потому что здесь “t” равно null.
2. Java NullPointerException при доступе/изменении поля null-объекта
В приведенной выше программе возникает следующий стек-трейс NullPointerException.
NullPointerException возникает в выражении int i = t.x;
, потому что “t” равно null.
3. Java NullPointerException при передаче null в аргумент метода
Это одно из наиболее распространенных случаев java.lang.NullPointerException
, потому что это вызывающий передает нулевой аргумент.
Ниже показано исключение нулевого указателя при выполнении вышеуказанной программы в среде Eclipse IDE.
4. java.lang.NullPointerException при выбрасывании null
Ниже приведен стек исключений указанной программы, показывающий NullPointerException из-за оператора throw null;
.
5. NullPointerException при получении длины массива null
6. NullPointerException при доступе к значению индекса массива null
7. NullPointerException при синхронизации с объектом null
Вызовет исключение NullPointerException, потому что объект “mutex” равен null при использовании synchronized(mutex)
.
8. HTTP-статус 500 java.lang.NullPointerException
Иногда мы получаем страницу ошибки от веб-приложения на Java с сообщением об ошибке “HTTP-статус 500 – Внутренняя ошибка сервера” и причиной java.lang.NullPointerException
.
Для этого я отредактировал проект Spring MVC Example и изменил метод HomeController следующим образом.
На изображении ниже показано сообщение об ошибке, которое возникает в ответе веб-приложения.
Вот трассировка стека исключений:
Корневая причина – NullPointerException в выражении user.getUserId().toLowerCase()
, потому что user.getUserId()
возвращает null.
Как обнаружить java.lang.NullPointerException
Обнаружение NullPointerException очень просто – просто посмотрите на трассировку исключения, и она покажет вам имя класса и номер строки, где произошло исключение. Затем посмотрите на код и определите, что может быть равно null и вызвать NullPointerException. Просто посмотрите на все вышеуказанные примеры, из стек-трейса очень ясно, что вызывает исключение нулевого указателя.
Как исправить NullPointerException
java.lang.NullPointerException – это непроверяемое исключение, поэтому его не обязательно перехватывать. Исключения нулевого указателя можно предотвратить с использованием проверок на null и техник профилактического программирования. Посмотрите на приведенные ниже примеры кода, показывающие, как избежать java.lang.NullPointerException
.
Лучшие практики кодирования для предотвращения NullPointerException
1. Рассмотрим нижеследующую функцию и обратим внимание на сценарий, приводящий к исключению null pointer.
Исключение NullPointerException может возникнуть, если аргумент передается как null. Ту же методу можно написать следующим образом, чтобы избежать NullPointerException.
2. Мы также можем добавить проверку на null для аргумента и выбросить IllegalArgumentException
, если это необходимо.
3. Мы можем использовать тернарный оператор, как показано в приведенном ниже примере кода.
4. Используйте String.valueOf()
вместо метода toString()
. Например, проверьте, что код метода println() из PrintStream определен следующим образом.
Нижеприведенный фрагмент кода показывает пример использования метода valueOf() вместо toString().
5. Напишите методы, возвращающие пустые объекты, вместо null, где это возможно, например, пустой список, пустая строка и т. д.
6. В классах коллекций определены некоторые методы, предотвращающие NullPointerException, их следует использовать. Например, contains(), containsKey() и containsValue().
Reference: API Document
Source:
https://www.digitalocean.com/community/tutorials/java-lang-nullpointerexception