Подтвердить что ты не робот

Integer.parseInt и NumberFormatException на Android

Я запустил следующий код в своем приложении для Android

Integer.parseInt("+91");

В Android 5.0 (Lollipop), не выбрал любое исключение, так как +91 является целым числом. Но в Android 4.4.x (KitKat) и более низких версиях он бросает:

NumberFormatException: Invalid Int: "+91"

Как версия Android вызывает эту разницу?

4b9b3361

Ответ 1

Поддержка явного + была добавлена ​​в this commit:

Support explicit + in Byte, Short, Integer, Long.

Bug: 5239391
Change-Id: I2b25228815d70d570d537db0ed9b5b759f25b5a3

который был включен начиная с android-5.0.0_r1. Если вы извлекли репозиторий Git, вы можете проверить с помощью:

git tag --contains 6b40837ee3a023bba698c38fd6d6e46ae0065a55

который дает вам

android-5.0.0_r1
android-5.0.0_r2
android-5.0.0_r3
...

Несмотря на то, что документация может дать представление о том, почему было сделано изменение (для достижения поведения Java 7, как указывают другие ответы), анализ истории исходного кода дает наиболее точный ответ на изменение поведения, поскольку документация не обязательно соответствуют реализации.

Ответ 2

Это поведение фактически является частью Java 7, а docs:

Разбирает строковый аргумент как целое число с десятичной точностью. Персонажи в строке должны быть десятичные числа, за исключением того, что первая символ может быть знаком ASCII минус '-' ('\ u002D'), чтобы указать отрицательное значение или знак ASCII плюс '+' ('\ u002B'), чтобы указать положительное значение.

Однако в Java 6 был принят только символ -.

Android SDK 21+ имеет зависимости JDK7, что, по-видимому, является причиной того, почему вы испытываете такое поведение.

Ответ 3

Он работает после Java 7.

Android 5 представляет новую функцию parseInt, такую ​​как версия Java 7 - Мартин Нордольтс отвечает точным образом на вопрос о версии

Итак, это означает, что ваш Lollipop использует новый sdk на основе Java 7, который также имеет метод parseInt с частью обработки знака.

KitKat действительно представил некоторые функции java 7 в Android sdk 19, но не новый parseInt. В более низких версиях используется более ранняя реализация parseInt (версия Java 6), поэтому они, очевидно, также потерпят неудачу.


Разница между реализациями parseInt:  Java 6 parseInt documentation vs Java 7 parseInt documentation

Ответ 4

Это специфическая для Java проблема. Как вы видите в документации, Java 6 позволяет - и Java 7 позволяет + или -.

В Android версии 19 (KitKat) поддерживается Java 7, поэтому вы не получите эту ошибку. Я рекомендую не использовать +, потому что вам нужен только знак, если у вас есть отрицательное целое число.