Перевод null pointer exception

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

Довольно часто при разработке на Java программисты сталкиваются с NullPointerException, появляющимся в самых неожиданных местах. В этой статье мы разберёмся, как это исправить и как стараться избегать появления NPE в будущем.

NullPointerException – что это такое?

NullPointerException (оно же NPE) это исключение, которое выбрасывается каждый раз, когда вы обращаетесь к методу или полю объекта по ссылке, которая равна null. Разберём простой пример:

Здесь на первой строке мы объявили переменную типа Integer и присвоили ей значение null (то есть переменная не указывает ни на какой существующий объект).
На второй строке мы обращаемся к методу toString переменной n1. Так как переменная равна null, метод не может выполниться (переменная не указывает ни на какой реальный объект), генерируется исключение NullPointerException:

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

В этой статье мы рассказали, как исправлять ситуации с NullPointerException и как эффективно предотвращать такие ситуации при разработке программ.

Источник

NullPointerException [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском.

Закрыт 5 лет назад .

В это куске кода ошибка NullPointerException

Точнее, она с return location.getLongitude() и return location.getLatitude(); . Помогите исправить, пожалуйста.

3 ответа 3

Ошибка NullPointerException значит, что метод ожидает каких то данных, а вместо этого получает НИЧТО — он ничего не может сделать, имея НИЧТО и говорит вам об этом.
Это как вы пришли в магазин и просите продать бубликов, а продавщица вам вместо самих бубликов подает ДЫРКИ от этих бубликов — вот то состояние, в которое вы впадете поняв, ЧТО вам дали и будет NullPointerException .
Подумайте, как вы будете пить чай со своей покупкой, а потом — что делать компилятору, имея такого «программиста», как вы.

Конкретно в вашем случае вы используете метод, который написали САМИ, СОБСТВЕННЫМИ руками указали, что требуется объект Location и теперь спрашиваете, что туда передавать — это за гранью добра уже .
Не думаете же вы, что вставив null ваша проблема чудесным образом решится сама собой и компилятор как то сам догадается за вас.

Если вы не знаете, какого типа данные требуются на вход методу, то посмотрите его сигнатуру в документации, если это метод из API ( аналогичную информацию предоставляет IDE, например в Android Studio — Ctrl+Q на нужном методе) . Там вы узнаете, что требуется на вход — начинайте узнавать, как получить данные такого типа.

Лирическое отступление далее — не ответ на вопрос, но видеть такое я больше не могу, а в комментарий все не входит. Прошу простить.

Слушай друг, вот ты обижаешься, что тебе не помогают. Ты должен понять, что на том уровне, на котором ты сейчас «программируешь», тебе никто не поможет в паре предложений.
Тебе нужно систематизированное знание не конкретно по этой проблеме, а по умению программировать вообще. Такое знание можно получить из учебников, курсов и пр. методических источников, но никак из решения этой твоей конкретной роблемы.
Ты просто не понимаешь, что ты делаешь и как надо делать. Даже, если тебе скажут решение конкретно этой проблемы (хотя его уже раз пять давали), ты через пару строчек уткнешся в другую, не менее нелепую по факту, но не преодолимую для тебя.
Если ты надеешся копипастом чужих идей и дониманием по каждой проблеме на разных ресурсах, вроде этого, написать какую то программу, то забудь — нельзя просто так взять и написать приложение, не зная языка программирования, на котором ты пишешь.

Если ты думаешь — начну что то делать и по ходу научусь (есть любители такого обучения программированию, которые по факту, как правило, просто не хотят ничего уметь, а думают, что так как то проскочут) , то ты УЧИСЬ уже — получил проблему, узнавай в чем причина, почему появилась, как исправить — ЧИТАЙ больше , узнавай новое, а НЕ ПИШИ о своих неудачах.

С таким подходом, в общем, ты свою программу никогда не напишешь.

Источник

Что такое Null Pointer Exception и как его исправить?

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

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

4 ответа 4

Когда вы объявляете переменную ссылочного типа, на самом деле вы создаете ссылку на объект данного типа. Рассмотрим следующий код для объявления переменной типа int:

В этом примере переменная x имеет тип int и Java инициализирует её как 0. Когда вы присвоите переменной значение 10 (вторая строка), это значение сохранится в ячейке памяти, на которую ссылается x .

Но когда вы объявляете ссылочный тип, процесс выглядит иначе. Посмотрим на следующий код:

В первой строке объявлена переменная num , ее тип не относится к встроенному, следовательно, значением является ссылка (тип этой переменной, Integer , является ссылочным типом). Поскольку вы еще не указали, на что собираетесь ссылаться, Java присвоит переменной значение Null , подразумевая «Я ни на что не ссылаюсь».

Во второй строке, ключевое слово new используется для создания объекта типа Integer . Этот объект имеет адрес в памяти, который присваивается переменной num . Теперь, с помощью переменной num вы можете обратиться к объекту используя оператора разыменования . .

Исключение, о котором вы говорите в вопросе, возникает, если вы объявили переменную, но не создали объект, то есть если вы попытаетесь разыменовать num до того, как создали объект, вы получите NullPointerException . В самом простом случае, компилятор обнаружит проблему и сообщит, что

num may not have been initialized

Что говорит: «возможно, переменная num не инициализирована».

Иногда исключение вызвано именно тем, что объект действительно не был создан. К примеру, у вас может быть следующая функция:

В этом случае создание объекта (переменная num ) лежит на вызывающем коде, то есть вы предполагаете, что он был создан ранее – до вызова метода doSomething . К сожалению, следующий вызов метода вполне возможен:

В этом случае значение переменной num будет null . Лучшим способом избежать данного исключения будет проверка на равенство нулю. Как результат, функция doSomething должна быть переписана следующим образом:

Как альтернативный вариант предыдущему примеру вы можете сообщить вызывающему коду, что метод был вызван с неверными параметрами, например, с помощью IllegalArgumentException .

Источник

Оцените статью
( Пока оценок нет )
Поделиться с друзьями
Uchenik.top - научные работы и подготовка
0 0 голоса
Article Rating
Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии