Что такое nullpointerexception и как это исправить

Содержание

Как избегать исключения NullPointerException

Существует множество техник и инструментов для того, чтобы избегать появления NullPointerException. Рассмотрим наиболее популярные из них.

Проверяйте на null все объекты, которые создаются не вами

Если объект создаётся не вами, иногда его стоит проверять на null, чтобы избегать ситуаций с NullPinterException. Здесь главное определить для себя рамки, в которых объект считается «корректным» и ещё «некорректным» (то есть невалидированным).

Не верьте входящим данным

Если вы получаете на вход данные из чужого источника (ответ из какого-то внешнего сервиса, чтение из файла, ввод данных пользователем), не верьте этим данным. Этот принцип применяется более широко, чем просто выявление ошибок NPE, но выявлять NPE на этом этапе можно и нужно. Проверяйте объекты на null. В более широком смысле проверяйте данные на корректность, и консистентность.

Возвращайте существующие объекты, а не null

Если вы создаёте метод, который возвращает коллекцию объектов – не возвращайте null, возвращайте пустую коллекцию. Если вы возвращаете один объект – иногда удобно пользоваться классом Optional (появился в Java 8).

Existing NullPointerException safe methods

3.1 Accessing static members or methods of a class

When your code attempts to access a static variable or method of a class, even if the object’s reference equals to , the JVM does not throw a . This is due to the fact that the Java compiler stores the static methods and fields in a special place, during the compilation procedure. Thus, the static fields and methods are not associated with objects, rather with the name of the class.

For example, the following code does not throw a :

TestStatic.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();
     }
}

Notice, that despite the fact that the instance of the  equals to , the method will be executed properly. However, when it comes to static methods or fields, it is better to access them in a static way, such as .

3.2 The instanceof operator

The  operator can be used, even if the object’s reference equals to . The  operator returns false when the reference equals to null and does not throw a . For example, consider the following code snippet:

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!");

The result of the execution is, as expected:

Not an instance of the String class!

This was a tutorial on how to handle the Java Null Pointer Exception ( java.lang.NullPointerException –  )

Important points on NullPointerException in Java

1) NullPointerException is an unchecked exception because it extends RuntimeException and it doesn’t mandate try-catch block to handle it.

2) When you get NullPointerException to look at the line number to find out which object is null, it may be an object which is calling any method.

3) Modern IDE like Netbeans and Eclipse gives you the hyperlink of the line where NullPointerException occurs

4) You can set anException break point in Eclipse to suspend execution when NullPointerException occurs read 10 tips on java debugging in Eclipse for more details.

5) Don’t forget to see the name of Threadon which NullPointerException occurs. in multi-threading, NPE can be a little tricky if some random thread is setting a reference to null.

6) It’s best to avoid NullPointerException while coding by following some coding best practices or putting a null check on the database as a constraint.

That’s all on What is java.lang.NullPointerException, When it comes, and how to solve it. In the next part of this tutorial, we will look at some best java coding practices to avoid NullPointerException in Java.

Other Java debugging tutorial

Определение «Java Error 500 Java.Lang.Nullpointerexception»

«Java Error 500 Java.Lang.Nullpointerexception» часто называется ошибкой во время выполнения (ошибка). Разработчики тратят много времени и усилий на написание кода, чтобы убедиться, что Java стабилен до продажи продукта. К сожалению, такие проблемы, как ошибка 500 java.lang.nullpointerexception, могут быть пропущены, и программное обеспечение будет содержать эти проблемы при выпуске.

Ошибка 500 java.lang.nullpointerexception, рассматриваемая как «Java Error 500 Java.Lang.Nullpointerexception», может возникнуть пользователями Java в результате нормального использования программы. Если происходит «Java Error 500 Java.Lang.Nullpointerexception», разработчикам будет сообщено об этой проблеме, хотя отчеты об ошибках встроены в приложение. Затем они исправляют дефектные области кода и сделают обновление доступным для загрузки. В результате разработчик может использовать пакеты обновлений для Java, доступные с их веб-сайта (или автоматическую загрузку), чтобы устранить эти ошибки 500 java.lang.nullpointerexception проблемы и другие ошибки.

Methods

Adds to the list of throwables suppressed by this.

(Inherited from Throwable)

(Inherited from Throwable)

(Inherited from Throwable)

Records the stack trace from the point where this method has been called
to this .

(Inherited from Throwable)

Returns a clone of the array of stack trace elements of this .

(Inherited from Throwable)

Returns the throwables suppressed by this.

(Inherited from Throwable)

Initializes the cause of this .

(Inherited from Throwable)

Writes a printable representation of this ‘s stack trace
to the stream.

(Inherited from Throwable)

Writes a printable representation of this ‘s stack trace
to the given print stream.

(Inherited from Throwable)

Writes a printable representation of this ‘s stack trace
to the specified print writer.

(Inherited from Throwable)

Sets the property.

(Inherited from Throwable)

Sets the array of stack trace elements.

(Inherited from Throwable)

(Inherited from Throwable)

(Inherited from Throwable)

Methods

Adds to the list of throwables suppressed by this.

(Inherited from Throwable)

(Inherited from Throwable)

(Inherited from Throwable)

Records the stack trace from the point where this method has been called
to this .

(Inherited from Throwable)

Returns a clone of the array of stack trace elements of this .

(Inherited from Throwable)

Returns the throwables suppressed by this.

(Inherited from Throwable)

Initializes the cause of this .

(Inherited from Throwable)

Writes a printable representation of this ‘s stack trace
to the stream.

(Inherited from Throwable)

Writes a printable representation of this ‘s stack trace
to the given print stream.

(Inherited from Throwable)

Writes a printable representation of this ‘s stack trace
to the specified print writer.

(Inherited from Throwable)

Sets the property.

(Inherited from Throwable)

Sets the array of stack trace elements.

(Inherited from Throwable)

(Inherited from Throwable)

(Inherited from Throwable)

Распространенные сообщения об ошибках в Java Error 500 Java.Lang.Nullpointerexception

Типичные ошибки Java Error 500 Java.Lang.Nullpointerexception, возникающие в Java для Windows:

  • «Ошибка в приложении: Java Error 500 Java.Lang.Nullpointerexception»
  • «Недопустимая программа Win32: Java Error 500 Java.Lang.Nullpointerexception»
  • «Извините за неудобства — Java Error 500 Java.Lang.Nullpointerexception имеет проблему. «
  • «К сожалению, мы не можем найти Java Error 500 Java.Lang.Nullpointerexception. «
  • «Отсутствует файл Java Error 500 Java.Lang.Nullpointerexception.»
  • «Ошибка запуска программы: Java Error 500 Java.Lang.Nullpointerexception.»
  • «Не удается запустить Java Error 500 Java.Lang.Nullpointerexception. «
  • «Ошибка Java Error 500 Java.Lang.Nullpointerexception. «
  • «Неверный путь к приложению: Java Error 500 Java.Lang.Nullpointerexception.»

Проблемы Java Error 500 Java.Lang.Nullpointerexception с участием Javas возникают во время установки, при запуске или завершении работы программного обеспечения, связанного с Java Error 500 Java.Lang.Nullpointerexception, или во время процесса установки Windows. Документирование проблем Java Error 500 Java.Lang.Nullpointerexception в Java является ключевым для определения причины проблем с электронной Windows и сообщения о них в Oracle Corporation.

Решение

Что же нам делать со всем этим? Ответ прост. Используйте только для геттеров.

Теперь этот класс можно безопасно использовать и как сущность Hibernate, и как DTO. никак не влияет на хранимые данные. Он только оборачивает возможные , чтобы корректно отрабатывать отсутствующие значения.

Однако у этого подхода есть один недостаток. Его нельзя полностью интегрировать с Lombok. не подерживаются библиотекой и, судя по некоторым обсуждениям на Github, не будут.

Я писал статью по Lombok и я думаю, что это прекрасный инструмент. Тот факт, что он не интегрируются с , довольно печален.

На текущий момент единственным выходом является ручное объявление необходимых геттеров.

Причины ошибок в файле Java Error 500 Java.Lang.Nullpointerexception

Проблемы Java и Java Error 500 Java.Lang.Nullpointerexception возникают из отсутствующих или поврежденных файлов, недействительных записей реестра Windows и вредоносных инфекций.

Более конкретно, данные ошибки Java Error 500 Java.Lang.Nullpointerexception могут быть вызваны следующими причинами:

  • Недопустимые разделы реестра Java Error 500 Java.Lang.Nullpointerexception/повреждены.
  • Вредоносные программы заразили Java Error 500 Java.Lang.Nullpointerexception, создавая повреждение.
  • Другая программа злонамеренно или по ошибке удалила файлы, связанные с Java Error 500 Java.Lang.Nullpointerexception.
  • Другая программа находится в конфликте с Java и его общими файлами ссылок.
  • Java/Java Error 500 Java.Lang.Nullpointerexception поврежден от неполной загрузки или установки.

Продукт Solvusoft

Совместима с Windows 2000, XP, Vista, 7, 8, 10 и 11

Что вызывает ошибку 500 java.lang.nullpointerexception во время выполнения?

Ошибки выполнения при запуске Java — это когда вы, скорее всего, столкнетесь с «Java Error 500 Java.Lang.Nullpointerexception». Рассмотрим распространенные причины ошибок ошибки 500 java.lang.nullpointerexception во время выполнения:

Ошибка 500 java.lang.nullpointerexception Crash — программа обнаружила ошибку 500 java.lang.nullpointerexception из-за указанной задачи и завершила работу программы. Если данный ввод недействителен или не соответствует ожидаемому формату, Java (или OS) завершается неудачей.

Утечка памяти «Java Error 500 Java.Lang.Nullpointerexception» — Когда Java обнаруживает утечку памяти, операционная система постепенно работает медленно, поскольку она истощает системные ресурсы. Возможные провокации включают отсутствие девыделения памяти и ссылку на плохой код, такой как бесконечные циклы.

Ошибка 500 java.lang.nullpointerexception Logic Error — логическая ошибка Java возникает, когда она производит неправильный вывод, несмотря на то, что пользователь предоставляет правильный ввод. Когда точность исходного кода Oracle Corporation низкая, он обычно становится источником ошибок.

Oracle Corporation проблемы с Java Error 500 Java.Lang.Nullpointerexception чаще всего связаны с повреждением или отсутствием файла Java. Как правило, решить проблему позволяет получение новой копии файла Oracle Corporation, которая не содержит вирусов. Кроме того, некоторые ошибки Java Error 500 Java.Lang.Nullpointerexception могут возникать по причине наличия неправильных ссылок на реестр. По этой причине для очистки недействительных записей рекомендуется выполнить сканирование реестра.

When in Java Code NullPointerException doesn’t come

1) When you access any static method or static variable with null reference.

If you are dealing with static variables or static methods then you won’t get a null pointer exception even if you have your reference variable pointing to null because static variables and method calls are bonded during compile time based on the class name and not associated with an object. for example below code will run fine and not throw NullPointerException because «market» is an static variable inside Trade Class.

Trade lowBetaTrade = null;String market = lowBetaTrade.market; //no NullPointerException market is static variable

When does NullPointerException occur in Java?

Javadoc of java.lang.NullPointerException has outlined scenario when it could occur:

1) When you call the instance method on a null object. you won’t get a null pointer exception if you call a static method or class method on the null object because the static method doesn’t require an instance to call any method.

2) While accessing or changing any variable or field on a null object.

3) Throwing null when an Exception is expected to throw.

4) When calling the length of an array when the array is null.

5) Accessing or changing slots of null just like an array.

6) When you try to synchronize on a null object or using null inside the synchronized block in Java.

Now, we will see examples of NullPointerException for each of the above scenarios to get it right and understand it better. You can also see these free Java programming courses to learn more about NullPointerException in Java. 

Знайте API

обладает огромным количеством фичей, правильное использование которых позволяет добиться более простого и понятного кода.

Идея проста: если имя отсутствует, вернуть значение по умолчанию. Можно сделать это лучше.

Давайте рассмотрим что-нибудь посложнее. Предположим, что мы хотим вернуть от имени пользователя. Если имя входит в список разрешенных, контейнер будет хранить значение, иначе — нет. Вот многословный пример.

упрощает код.

Этот подход стоит применять не только в контексте , но ко всему процессу разработки.

Если что-то доступно из коробки, попробуйте использовать это, прежде чем пытаться сделать свое.

Не передавайте Optional в качестве параметра

А сейчас мы начинаем обсуждать наиболее спорные моменты.

Почему не стоит передавать в качестве параметра? На первый взгляд, это позволяет избежать , так ведь? Возможно, но корни проблемы уходят глубже.

Во-первых, API имеет ненужные границы. При каждом вызове пользователь вынужден оборачивать значения в . Даже предустановленные константы.

Во-вторых, обладает четырьмя потенциальными поведениями в зависимости от того, являются ли переданные пустыми, или нет.

В-третьих, мы понятия не имеем, как реализация интерпретирует . Возможно, в случае пустого контейнера происходит простая замена на значение по умолчанию. Может быть, выбрасывается . Но также вероятно, что наличие или отсутствие данных в монаде может полностью поменять бизнес-логику.

Если взглянуть на javadoc к , можно найти там интересную заметку.

Optional главным образом предназначен для использования в качестве возвращаемого значения в тех случаях, когда нужно отразить состояние «нет результата» и где использование null может привести к ошибкам.

буквально символизирует нечто, что может содержать значение, а может — нет. Передавать возможное отсутствие результата в качестве параметра звучит как плохая идея. Это значит, что API знает слишком много о контексте выполнения и принимает те решения, о которых не должен быть в курсе.

Что же, как мы можем улучшить этот код? Если и должны всегда присутствовать, мы можем легко избавиться от и решать проблему отсутствующих значений на верхнем уровне.

Теперь вызывающий код полностью контролирует значения аргументов. Это становится еще более критичным, если вы разрабатываете фреймворк или библиотеку.

С другой стороны, если значения и могут быть опущены, вышеописанный способ не заработает. В этом случае лучшим решением будет разделение API на отдельные методы, удовлетворяющим разным пользовательским потребностям.

Возможно это выглядит несколько многословно, но теперь пользователь может сам решить, какой метод вызвать, избегая непредвиденных ошибок.

Решение ошибки Java.net.ConnectException

Ошибка модуля Java.net.ConnectException: Connection timed out возникает во время загрузки игры на сервере.

Перед устранением убедитесь в отсутствии следующих причин:

  • технические работы на сервере;
  • окончание возможности пользоваться платными услугами;
  • отсутствие подключения интернета от провайдера на компьютере в целом;
  • блокировка игрока по IP.

Если перечисленных проблем не замечено, обратите внимание на такие факторы:

  1. Актуальность версии игры. Если подключиться к серверу невозможно, проверьте наличие обновлений Minecraft. Конфликт файлов неизбежно приведет к ошибке. Достаточно доступа к интернету и возможности загрузки новых пакетов.
  2. Желание установить новые моды и патчи приводит к тому, что необкатанное ПО блокирует подключение к серверу. Удалите последние дополнения или переустановите игру. Чтобы предотвратить ошибку, используйте проверенные расширения.
  3. Блокировка брандмауэра или антивируса заслуживает отдельного внимания. Явно определить источник проблемы не получится. Пользователю придется отключать программы для защиты компьютера по очереди.

Как исправить ошибку java.lang.nullpointerexception

Как избавиться от ошибки java.lang.nullpointerexception? Способы борьбы с проблемой можно разделить на две основные группы – для пользователей и для разработчиков.

Для пользователей

Если вы встретились с данной ошибкой во время запуска (или работы) какой-либо программы (особенно это касается java.lang.nullpointerexception minecraft), то рекомендую выполнить следующее:

  1. Переустановите пакет Java на своём компьютере. Скачать пакет можно, к примеру, вот отсюда;
  2. Переустановите саму проблемную программу (или удалите проблемное обновление, если ошибка начала появляться после такового);
  3. Напишите письмо в техническую поддержку программы (или ресурса) с подробным описанием проблемы и ждите ответа, возможно, разработчики скоро пофиксят баг.
  4. Также, в случае проблем в работе игры Майнкрафт, некоторым пользователям помогло создание новой учётной записи с административными правами, и запуск игры от её имени.

Java ошибка в Майнкрафт

Для разработчиков

Разработчикам стоит обратить внимание на следующее:

  1. Вызывайте методы equals(), а также equalsIgnoreCase() в известной строке литерала, и избегайте вызова данных методов у неизвестного объекта;
  2. Вместо toString() используйте valueOf() в ситуации, когда результат равнозначен;
  3. Применяйте null-безопасные библиотеки и методы;
  4. Старайтесь избегать возвращения null из метода, лучше возвращайте пустую коллекцию;
  5. Применяйте аннотации @Nullable и @NotNull;
  6. Не нужно лишней автоупаковки и автораспаковки в создаваемом вами коде, что приводит к созданию ненужных временных объектов;
  7. Регламентируйте границы на уровне СУБД;
  8. Правильно объявляйте соглашения о кодировании и выполняйте их.

Что из себя представляет исключение Null Pointer Exception ( java.lang.NullPointerException ) и почему оно может происходить?

Какие методы и средства использовать, чтобы определить причину возникновения этого исключения, приводящего к преждевременному прекращению работы приложения?

Не используйте Optional в качестве полей класса

Я слышал разные мнения по этому вопросу. Некоторые считают, что хранение напрямую в полях класса позволяет сократить на порядок. Мой друг, который работает в одном известном стартапе, говорит, что такой подход в их компании является утвержденным паттерном.

Хотя хранение в полях класса и звучит как хорошая идея, я думаю, что это может принести больше проблем, чем пользы.

Отсутствие сериализуемости

не имлементирует интерфейс . Это не баг, это намеренное решение, так как данный класс был спроектирован для использования в качестве возвращаемого значения. Проще говоря, любой объект, который содержит хотя бы одно поле, нельзя сериализовать.

На мой взгляд, этот аргумент является наименее убедительным, так как сейчас, в мире микросервисов и распределенных систем, платформенная сериализация не является настолько важной, как раньше

Хранение лишних ссылок

— это объект, который необходим пользователю всего несколько миллисекунд, после чего он может быть безболезненно удален сборщиком мусора. Но если мы храним в качестве поля, он может оставаться там вплоть до самой остановки программы. Скорее всего, вы не заметите никаких проблем с производительностью на маленьких приложениях. Однако, если речь идет о большом сервисе с дюжинами бинов, последствия могут быть другие.

Плохая интеграция со Spring Data/Hibernate

Предположим, что мы хотим построить простое Spring Boot приложение. Нам нужно получить данные из таблицы в БД. Сделать это очень просто, объявив Hibernate сущность и соответствующий репозиторий.

Вот возможный результат для .

Пусть поля и могут быть . Мы не хотим иметь дело с , так что просто заменим обычный тип поля на .

Теперь все сломано.

Hibernate не может замапить значения из БД на напрямую (по крайней мере, без кастомных конвертеров).

Но некоторые вещи работают правильно

Должен признать, что в конечном итоге не все так плохо. Некоторые фреймворки корректно интегрируют Optional в свою экосистему.

Jackson

Давайте объявим простой эндпойнт и DTO.

Результат для .

Как вы можете заметить, нет никакой дополнительной конфигурации. Все работает из коробки. Давайте попробуем заменить на .

Для того чтобы проверить разные варианты работы, я заменил один параметр на .

Как ни странно, все по-прежнему работает так, как и ожидается.

Это значит, что мы можем использовать в качестве полей DTO и безопасно интегрироваться со Spring Web? Ну, вроде того. Однако есть потенциальные проблемы.

SpringDoc

SpringDoc — это библиотека для Spring Boot приложений, которая позволяет автоматически сгенерировать Open Api спецификацию.

Вот пример того, что мы получим для эндпойнта .

Выглядит довольно убедительно. Но нам нужно сделать поле обязательным. Это можно осуществить с помощью аннотации или . Давайте добавим кое-какие детали. Что если мы поставим аннотацию над полем типа ?

Это приведет к интересным результатам.

Как видим, поле действительно добавилось в список обязательных. Так же, как и . А вот здесь начинается самое интересное. Поле с не может быть обязательным, так как само его наличие говорит о том, что значение потенциально может отсутствовать. Тем не менее, мы смогли запутать фреймворк с помощью всего лишь одной лишней аннотации.

В чем здесь проблема? Например, если кто-то на фронтенде использует генератор типов сущностей по схеме Open Api, это приведет к получению неверной структуры, что в свою очередь может привести к повреждению данных.

How to fix NullPointerException

java.lang.NullPointerException is an unchecked exception, so we don’t have to catch it. The null pointer exceptions can be prevented using null checks and preventive coding techniques. Look at below code examples showing how to avoid .

if(mutex ==null) mutex =""; //preventive coding
		
synchronized(mutex) {
	System.out.println("synchronized block");
}
//using null checks
if(user!=null && user.getUserName() !=null) {
System.out.println("User Name: "+user.getUserName().toLowerCase());
}
if(user!=null && user.getUserName() !=null) {
	System.out.println("User ID: "+user.getUserId().toLowerCase());
}

The common cause of NullPointerException in Java as Example

Based upon my experience java.lang.NullPointerException repeats itself in various formats, I have collected the most common cause of java.lang.NullPointerException in java code and explained them here, we will use the following Trade class for example :

publicclass Trade {private String symbol;privateint price;publicstatic String market;public Trade(String symbol, int price){this.symbol = symbol;this.price = price;}publicint getPrice(){return price;}publicvoid setPrice(int price){this.price = price;}public String getSymbol(){return symbol;}publicvoid setSymbol(String symbol){this.symbol = symbol;}}

1)  Java  NullPointerException while calling instance method on null object

This is probably the most common cause of this error, you call method on some object and found that the reference is null, always perform null check if you see possibility of null before calling any method on object.

Trade pennyStock = null;pennyStock.getPrice(); //this will throw NullPointerExceptionException in thread «main» java.lang.NullPointerExceptionat test.NullPointerExceptionTest.main(NullPointerExceptionTest.java:23)

2) NullPointerException in Java while accessing field on a null reference.

Trade fxtrade = null;int price = fxtrade.price; //here fxtrade is null, you can’t access field hereException in thread «main» java.lang.NullPointerExceptionat test.NullPointerExceptionTest.main(NullPointerExceptionTest.java:64)

3) java.lang.NullPointerException when throwing null as an exception.

If you throw an Exception object and if that is null you will get a null pointer exception as shown in the below example

RuntimeException nullException = null;throw nullException;Exception in thread «main» java.lang.NullPointerExceptionat test.NullPointerExceptionTest.main(NullPointerExceptionTest.java:74)

4) example of NullPointerException is when getting the length of an array that is null.

Trade[] bluechips = null;int length = bluechips.length;  //array is null hereException in thread «main» java.lang.NullPointerExceptionat test.NullPointerExceptionTest.main(NullPointerExceptionTest.java:85)

5) Example of NPE when accessing an element of a null array.

Trade[] bluechips = null;Trade motorola = bluechips; //array is null hereException in thread «main» java.lang.NullPointerExceptionat test.NullPointerExceptionTest.main(NullPointerExceptionTest.java:94)

6) You will also get NullPointerException in Java if you try to synchronize on a null object or try to use the null object inside the synchronized block in Java.

Trade highbetaTrade = null;synchronized(highbetaTrade){System.out.print(«This statement is synchronized on null»);}

Exception in thread «main» java.lang.NullPointerExceptionat test.NullPointerExceptionTest.main(NullPointerExceptionTest.java:104)

ява.ланг.Исключение NullPointerException-одно из самых популярных исключений в программировании на Java. Любой, кто работает на java, должен был видеть, как это появляется из ниоткуда в автономной программе java, а также в веб-приложении java .

Исключение NullPointerException является исключением во время выполнения, поэтому нам не нужно перехватывать его в программе. Исключение NullPointerException возникает в приложении, когда мы пытаемся выполнить какую-либо операцию над null , где требуется объект. Некоторые из распространенных причин исключения NullPointerException в программах Java являются:

  1. Вызов метода в экземпляре объекта, но во время выполнения объект равен нулю.
  2. Доступ к переменным экземпляра объекта, который является нулевым во время выполнения.
  3. Выбрасывание null в программе
  4. Доступ к индексу или изменение значения индекса массива, который равен нулю
  5. Проверка длины массива, который является нулевым во время выполнения.

Вопрос: Как определить причину исключения NPE в моем коде?

Это трудная часть. Короткий ответ заключается в применении логического вывода к доказательствам, предоставленным трассировкой стека, исходным кодом и соответствующей документацией API.

Сначала проиллюстрируем простой пример (см. выше). Мы начнем с просмотра строки, о которой рассказывал нам стек, где находится NPE:

Как это может вызвать NPE?

На самом деле существует только один способ: это может произойти только в том случае, если имеет значение . Затем мы пытаемся запустить метод на и… BANG!

Но (я слышал, вы говорите), что, если NPE был брошен внутри вызова метода ?

Хорошо, если это произошло, трассировка стека будет выглядеть по-другому. В первой строке «at» будет указано, что исключение было выбрано в некоторой строке класса , а строка 4 из будет второй строкой «at» .

Итак, откуда взялось это ? В этом случае это очевидно, и очевидно, что нам нужно сделать, чтобы исправить это. (Назначьте ненулевое значение .)

Хорошо, давайте попробуем немного более хитрый пример. Для этого потребуется некоторый логический вывод.

Итак, теперь у нас есть две строки «at» . Первый для этой строки:

а второй — для этой строки:

Глядя на первую строчку, как это может вызвать NPE? Существует два способа:

  • Если значение равно , тогда будет вызывать NPE.
  • Если значение равно , то вызов на нем вызовет NPE.

Затем нам нужно выяснить, какой из этих сценариев объясняет, что на самом деле происходит. Мы начнем с изучения первого:

Откуда ? Это параметр для вызова метода , и если мы посмотрим, как был вызван , мы можем видеть, что он исходит из статической переменной . Кроме того, мы можем ясно видеть, что мы инициализировали ненулевому значению. Этого достаточно, чтобы условно отвергнуть это объяснение. (Теоретически что-то другое могло бы изменить на … но этого здесь не происходит.)

Как насчет второго сценария? Итак, мы можем видеть, что — , поэтому это означает, что должен быть . Возможно ли это?

В самом деле, это так! И в этом проблема. Когда мы инициализируем так:

мы выделяем двумя элементами, которые инициализируются . После этого мы не изменили содержимое … так что все равно будет .

Рекомендации по кодированию, чтобы избежать исключения 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. Мы также можем добавить нулевую проверку аргумента и выбросить при необходимости.

public int getArrayLength(Object[] array) {
	
	if(array == null) throw new IllegalArgumentException("array is null");
	
	return array.length;
}

3. Мы можем использовать тернарный оператор, как показано в приведенном ниже примере кода.

String msg = (str == null) ? "" : str.substring(0, str.length()-1);

4. Используйте метод вместо метода . Например, проверьте, что код метода 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, вы должны их использовать. Например, содержит(), содержит () и содержит значение().

Ссылка: Документ API

Как исправить NullPointerException

В нашем простейшем примере мы можем исправить NPE, присвоив переменной n1 какой-либо объект (то есть не null):

Integer n1 = 16;
System.out.println(n1.toString());

Теперь не будет исключения при доступе к методу toString и наша программа отработает корректно.

Если ваша программа упала из-за исключение NullPointerException (или вы перехватили его где-либо), вам нужно определить по стектрейсу, какая строка исходного кода стала причиной появления этого исключения. Иногда причина локализуется и исправляется очень быстро, в нетривиальных случаях вам нужно определять, где ранее по коду присваивается значение null.

Иногда вам требуется использовать отладку и пошагово проходить программу, чтобы определить источник NPE.

Вопрос: Как я прочитал стек стека NPE?

Предположим, что я компилирую и запускаю программу выше:

Первое наблюдение: компиляция завершается успешно! Проблема в программе НЕ является ошибкой компиляции. Это ошибка времени выполнения. (Некоторые IDE могут предупредить, что ваша программа всегда будет генерировать исключение… но стандартный компилятор не делает.)

Второе наблюдение: при запуске программы он выводит две строки «gobbledy-gook». НЕПРАВИЛЬНО!!. Это не ласково. Это stacktrace… и он предоставляет важную информацию, которая поможет вам отследить ошибку в вашем коде, если вы потратите время, чтобы внимательно прочитать ее.

Итак, давайте посмотрим, что он говорит:

Первая строка трассировки стека сообщает вам несколько вещей:

  • Он сообщает вам имя потока Java, в котором было выбрано исключение. Для простой программы с одним потоком (как этот) она будет «основной». Позвольте двигаться дальше…
  • Он сообщает вам полное имя исключения, которое было выбрано; т.е. .
  • Если у исключения есть связанное сообщение об ошибке, оно будет выведено после имени исключения. является необычным в этом отношении, потому что он редко имеет сообщение об ошибке.

Вторая строка является наиболее важной при диагностике NPE. Это говорит нам о многом:

Это говорит нам о многом:

  • «в Test.main» говорит, что мы были в методе класса .
  • «Test.java:4» дает исходное имя файла класса, и он сообщает нам, что оператор, где это произошло, находится в строке 4 файла.

Если вы подсчитаете строки в файле выше, строка 4 — это та, которую я обозначил комментарием «ЗДЕСЬ».

Обратите внимание, что в более сложном примере в трассе стека NPE будет много строк. Но вы можете быть уверены, что вторая строка (первая строка «в строке» ) сообщит вам, куда был сброшен NPE 1

Короче говоря, трассировка стека однозначно скажет нам, какая инструкция программы выбрала NPE.

1 — Не совсем верно. Есть вещи, называемые вложенными исключениями…

Заключение

При устранении ошибки java.lang.nullpointerexception важно понимать, что данная проблема имеет программную основу, и мало коррелирует с ошибками ПК у обычного пользователя. В большинстве случаев необходимо непосредственное вмешательство разработчиков, способное исправить возникшую проблему и наладить работу программного продукта (или ресурса, на котором запущен сам продукт)

В случае же, если ошибка возникла у обычного пользователя (довольно часто касается сбоев в работе игры Minecraft), рекомендуется установить свежий пакет Java на ПК, а также переустановить проблемную программу.