Следующий код выдает NullPointerException
:
int num = Integer.getInteger("123");
Вызывает ли мой компилятор значение getInteger
null, поскольку оно статично? В этом нет никакого смысла!
Что творится?
java
integer
nullpointerexception
api-design
autoboxing
user282886
источник
источник
Ответы:
Большая картинка
Здесь есть две проблемы:
Integer getInteger(String)
не делает то, что вы думаетеnull
в этом случаеInteger
доint
вызывает автоматическую распаковкуInteger
ISnull
,NullPointerException
брошеноДля того, чтобы разобрать ,
(String) "123"
чтобы(int) 123
, вы можете использовать , напримерint Integer.parseInt(String)
.Ссылки
Integer
Ссылки APIstatic int parseInt(String)
static Integer getInteger(String)
На
Integer.getInteger
Вот что говорится в документации о том, что делает этот метод:
Другими словами, этот метод не имеет ничего общего с разбора
String
наint/Integer
значение, но , скорее, имеет отношение кSystem.getProperty
методу.По общему признанию, это может быть сюрпризом. К сожалению, в библиотеке есть такие сюрпризы, но она преподает вам ценный урок: всегда ищите документацию, чтобы узнать, что делает метод.
По совпадению, вариация этой проблемы была представлена в « Возвращении головоломок: Шлок и трепет» (TS-5186) , презентации Джоша Блоха и Нила Гафтера на технической сессии JavaOne 2009 года. Вот заключительный слайд:
Для полноты картины существуют также эти методы, аналогичные
Integer.getInteger
:Boolean.getBoolean(String)
Long.getLong(String)
Связанные вопросы
На автоответчике
Другой вопрос, конечно, в том, как
NullPointerException
его бросают. Чтобы сосредоточиться на этой проблеме, мы можем упростить фрагмент следующим образом:Вот цитата из Effective Java 2nd Edition, пункт 49: Предпочитайте примитивные типы упакованным примитивам:
Есть места, где у вас нет выбора, кроме как использовать упакованные примитивы, например дженерики, но в противном случае вам следует серьезно подумать, оправдано ли решение использовать упакованные примитивы.
Связанные вопросы
источник
Integer.getInteger(s)
примерно эквивалентноInteger.parseInt(System.getProperty(s))
? Я думаю, что предпочитаю второй, хотя он более подробный, потому что он подчеркивает тот факт, что вы извлекаете информацию из свойств системы.Integer.decode
вместоInteger.parseInt
, который ищет начало0x
или0
анализирует число как шестнадцатеричное или восьмеричное, соответственно.NullPointerException
? : programmers.stackexchange.com/questions/158908/…С http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html :
Вы хотите это:
источник
Пожалуйста, проверьте документацию метода getInteger () . В этом методе
String
параметр является системным свойством, определяющим целочисленное значение системного свойства с указанным именем. «123» - это не имя какого-либо системного свойства, как здесь обсуждается . Если вы хотите преобразовать эту строку вint
, используйте метод какint num = Integer.parseInt("123")
.источник