Что такое NullPointerException ?
Что бы ответить на этот вопрос нам необходимо понять, чем отличаются переменные примитивных и ссылочных типов. Переменная примитивного типа (int, double, boolean, char и пр...
🖥 Что такое Null Pointer Exception и как его исправить? ▶️Что из себя представляет исключение java.lang.NullPointerException и почему оно может происходить? Какие методы и средства использовать, чтобы определить причину возникновения этого исключения, приводящего к преждевременному прекращению работы приложения? Ответ и решение ⏩Когда вы объявляете переменную ссылочного типа, на самом деле вы создаете ссылку на объект данного типа. Рассмотрим следующий код для объявления переменной типа 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 вы можете обратиться к объекту используя оператора разыменования .. ⏩Исключение java.lang.NullPointerException возникает, если вы объявили переменную, но не создали объект, то есть если вы попытаетесь разыменовать 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 } @javarush