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

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

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

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

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

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

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

  • 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 в Java без StackTrace
  • Tricky trernary operator в Java - автобоксинг
  • android.app.Application не может быть создан из-за NullPointerException
  • Избегание! = Null
  • Какую @NotNull Java-аннотацию следует использовать?
  • java.lang.RuntimeException: Ошибка предоставления результата ResultInfo {who = null, request = 1888, result = 0, data = null} для активности
  • Булевы, условные операторы и автобоксинг
  • java.lang.NullPointerException: попытка вызвать виртуальный метод для ссылки на нулевой объект
  • Трассировка стека NullPointerException недоступна без агента отладки
  • Почему String.valueOf (null) вызывает исключение NullPointerException?
  • Android - NullPointerException в SearchView в панели действий
  • Interesting Posts

    Android – стильная панель поиска

    Какую файловую систему использовать на моем USB-жестком диске? FAT32 или NTFS?

    Как получить доступ к необработанным данным буфера обмена в Windows?

    Как удалить внутренние диски SATA из меню «Безопасное извлечение оборудования»?

    org.hibernate.MappingException: Не удалось определить тип для: java.util.List, at table: College, для столбцов:

    Как firstprivate и lastprivate отличаются от private clauses в OpenMP?

    Apache Commons equals / hashCode builder

    Включение адресной строки в новую вкладку в Firefox

    Предотвращение заставки, начиная с приложения в полноэкранном режиме

    В чем разница между начальным / конечным маржем Android и правым / левым?

    Каковы основные цвета? RGB или CMY?

    Как восстановить базу данных MySQL из файлов .myd, .myi, .frm

    Vista работает как мусор после попытки обновления памяти

    Как использовать ArgumentCaptor для stubbing?

    Как создать файл, который называется аргументом командной строки?

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