Почему использование целого числа Java со значением по умолчанию приводит к исключению NullPointerException?

StackOverflow https://stackoverflow.com/questions/2437603

Вопрос

Я новичок в 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) объект каждый раз, вместо того, чтобы тратить конструкцию объекта на совершенно новый идентичный целочисленный объект

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top