Почему int num = Integer.getInteger («123») бросает NullPointerException?

Следующий код генерирует NullPointerException :

 int num = Integer.getInteger("123"); 

Мой компилятор getInteger на getInteger на null, поскольку он является статическим? Это не имеет никакого смысла!

Что происходит?

3 Solutions collect form web for “Почему int num = Integer.getInteger («123») бросает NullPointerException?”

Большая картина

Здесь есть два вопроса:

  • Integer getInteger(String) не делает то, что, по вашему мнению, делает
    • Он возвращает null в этом случае
  • назначение от Integer к int вызывает автоматическое распаковку
    • Поскольку Integer имеет значение null , NullPointerException

Для синтаксического анализа (String) "123" на (int) 123 вы можете использовать, например, int Integer.parseInt(String) .

Рекомендации

  • Руководство по языку Java / Autoboxing

Integer ссылки API

  • static int parseInt(String)
  • static Integer getInteger(String)

В Integer.getInteger

Вот что документация должна сказать о том, что делает этот метод:

public static Integer getInteger(String nm) : определяет целочисленное значение системного свойства с указанным именем. Если нет свойства с указанным именем, если указанное имя пустое или пустое, или если свойство не имеет нужного числового формата, возвращается значение null .

Другими словами, этот метод не имеет ничего общего с parsingом String для значения int/Integer , а скорее имеет отношение к методу System.getProperty .

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

В этой связи вариация этой проблемы была отмечена в статье «Возrotation головоломок: Шлок и Awe» (TS-5186) , Josh Bloch и Neal Gafter в 2009 году. Вот заключительный слайд:

Мораль

  • Странные и ужасные методы скрываются в библиотеках
    • У некоторых есть безобидные звуковые имена
  • Если ваш код неверно работает
    • Убедитесь, что вы вызываете правильные методы
    • Прочитать библиотечную документацию
  • Для дизайнеров API
    • Не нарушайте принцип наименьшего удивления
    • Не нарушайте иерархию абстракции
    • Не используйте похожие имена для совершенно разных видов поведения

Для полноты также существуют такие методы, которые аналогичны Integer.getInteger :

  • Boolean.getBoolean(String)
  • Long.getLong(String)

Связанные вопросы

  • Самое удивительное нарушение принципа наименьшего удивления
  • Самый неудобный / вводящий в заблуждение метод в Java Base API?

На автообновлении

Другой проблемой, конечно же, является то, как NullPointerException . Чтобы сосредоточиться на этой проблеме, мы можем упростить fragment следующим образом:

 Integer someInteger = null; int num = someInteger; // throws NullPointerException!!! 

Вот цитата из Effective Java 2nd Edition, Item 49: Предпочитаете примитивные типы для примитивов в штучной упаковке:

В общем, используйте примитивы, предпочитая вложенные в бокс примитивы, когда у вас есть выбор. Примитивные типы проще и быстрее. Если вы должны использовать примитивы в штучной упаковке, будьте осторожны! Автобоксинг уменьшает многословие, но не опасность использования примитивов в штучной упаковке. Когда ваша программа сравнивает два вложенных в примитив примитива с оператором == , это делает сравнение идентичности, которое почти наверняка не то, что вы хотите. Когда ваша программа выполняет смешанные вычисления с использованием примитивов с боксами и unboxed, она делает unboxing, и когда ваша программа делает unboxing, она может NullPointerException . Наконец, когда ваши программные боксы имеют примитивные значения, это может привести к дорогостоящим и ненужным созданиям объектов.

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

Связанные вопросы

  • В чем разница между int и Integer в Java / C #?
  • Почему автобоксинг в Java позволяет мне иметь 3 возможных значения для логического?
  • Гарантировано ли, что новый Integer (i) == i в Java? (ДА!!!)
  • При сравнении двух целых чисел в Java происходит автоматическое разблокирование? (НЕТ !!!)
  • Java noob: генерики только над объектами? (Да, к сожалению)

С http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html :

getInteger ‘Определяет целочисленное значение системного свойства с указанным именем.’

Вы хотите это:

 Integer.parseInt("123") 

Пожалуйста, проверьте документацию метода getInteger () . В этом методе параметр String является системным свойством, которое определяет целочисленное значение системного свойства с указанным именем. «123» – это не имя какого-либо системного свойства, как описано здесь . Если вы хотите преобразовать эту строку в int , используйте этот метод как int num = Integer.parseInt("123") .

  • Почему статические поля не инициализируются во времени?
  • Доступ к инъецируемой зависимости в конструкторе управляемого компонента вызывает NullPointerException
  • Android startCamera дает мне null Intent и ... разрушает мою глобальную переменную?
  • Мое текущее местоположение всегда возвращает null. Как я могу это исправить?
  • Загрузите листок данных Excel в базу данных Oracle
  • Почему мое Spring @Autowired поле null?
  • Изящно избегая NullPointerException в Java
  • Загрузка ресурса изображения
  • Трассировка стека NullPointerException недоступна без агента отладки
  • Ошибка вызывает виртуальный метод 'double android.location.Location.getLatitude ()' в ссылке на нулевой объект
  • Загрузчик содержимого Android SDK не работает с NullPointerException
  • Interesting Posts

    API Google Map – удаление маркеров

    Является ли перегрузка метода рассмотренным polymorphismом?

    Отключить автоформат в Excel 2010

    Есть ли способ скрыть ярлыки панели задач и не комбинировать кнопки панели задач?

    Могу ли я повторно использовать HttpWebRequest?

    Установка системного времени телефона ROOTED

    Как просмотреть данные из файла .RData?

    Настройка трех мониторов на машине со встроенной графической картой

    Будет ли новый возврат NULL в любом случае?

    Окончательный способ использования Picasa в домашней сети

    xcrun: Ошибка: не удалось установить активный путь Xcode ‘/Volumes/Xcode/Xcode45-DP1.app/Contents/Developer’. (Данный файл или каталог отсутствует)

    MongoDB и «объединяется»

    ковариация в c #

    Как сохранить диакритические знаки при использовании кросс-монтирующих дисков для Windows7 и Linux

    Динамический двумерный массив с указателем на указатель

    Давайте будем гением компьютера.