Почему использование целого числа Java со значением по умолчанию приводит к исключению NullPointerException?
-
19-09-2019 - |
Вопрос
Я новичок в Java.Я только что прочитал, что переменные класса в Java имеют значение по умолчанию.
Я попробовал следующую программу и ожидал получить результат в виде 0
, что является значением по умолчанию для целого числа, но я получаю NullPointerException
.
Что я упускаю из виду?
class Test{
static Integer iVar;
public static void main(String...args) {
System.out.println(iVar.intValue());
}
}
Решение
Вы правы, неинициализированным переменным класса в Java присвоено значение по умолчанию. Integer
типы в Java не совпадают с int
. Integer
это класс-оболочка, который обертывает значение примитивного типа int
в объекте.
В вашем случае iVar
является ссылкой на Integer
объект, который не был инициализирован.Неинициализированные ссылки получают значение по умолчанию null
и когда вы пытаетесь применить intValue
() метод по нулевой ссылке, вы получаете NullPointerException
.
Чтобы полностью избежать этой проблемы, вам нужно, чтобы ваша ссылочная переменная ссылалась на Integer
объект как:
class Test {
// now iVar1 refers to an integer object which wraps int 0.
static Integer iVar1 = new Integer(0);
// uninitialized int variable iVar2 gets the default value of 0.
static int iVar2;
public static void main(String...args) {
System.out.println(iVar1.intValue()); // prints 0.
System.out.println(iVar2); // prints 0.
}
}
Другие советы
Это означает , что iVar
равно нулю.В Java вы не можете вызывать методы по нулевой ссылке, это генерирует исключение NullPointerException, которое вы видите.
private Integer amount=Integer.valueOf(0);
private Integer points=Integer.valueOf(0);
В частности, почему вы должны использовать Integer.valueOf(int)
вместо нового целого числа(int):КЭШИРОВАНИЕ.
Этот вариант valueOf
был добавлен в JDK 5 к Byte, Short, Integer и Long (он уже существовал в тривиальном случае в Boolean начиная с JDK 1.4).Все это, конечно, неизменяемые объекты в Java.Раньше считалось, что если вам нужен целочисленный объект из int, вы создадите новое целое число.Но в JDK 5 + вам действительно следует использовать valueOf, потому что Integer теперь кэширует целочисленные объекты между -128 и 127 и может возвращать вам один и тот же точный целочисленный (0) объект каждый раз, вместо того, чтобы тратить конструкцию объекта на совершенно новый идентичный целочисленный объект