Android上的Integer.parseInt和NumberFormatException

Ash*_*win 43 java android

我在Android应用中运行了以下代码

Integer.parseInt("+91");
Run Code Online (Sandbox Code Playgroud)

Android 5.0(Lollipop)中,它没有抛出任何异常,因为它+91是一个整数.但是在Android 4.4.x(KitKat)和更低版本中它会抛出:

NumberFormatException:无效的Int:"+ 91"

Android的版本如何导致这种差异?

Mar*_*lts 45

+此提交中添加了对显式的支持:

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

Bug: 5239391
Change-Id: I2b25228815d70d570d537db0ed9b5b759f25b5a3
Run Code Online (Sandbox Code Playgroud)

已包括在内android-5.0.0_r1.如果您已获取Git存储库,则可以使用以下命令进行验证:

git tag --contains 6b40837ee3a023bba698c38fd6d6e46ae0065a55
Run Code Online (Sandbox Code Playgroud)

给你的

android-5.0.0_r1
android-5.0.0_r2
android-5.0.0_r3
...
Run Code Online (Sandbox Code Playgroud)

尽管文档可以给见解,为什么进行了更改(实现Java 7的行为,其他的答案指出),分析源代码的历史给出最准确的答案时,行为改变,因为文件不一定与实现.


Ed *_*rge 23

这种行为实际上是Java 7的一部分,正如文档所述:

将字符串参数解析为带符号的十进制整数.字符串中的字符必须都是十进制数字,除了第一个字符可以是ASCII减号' - '('\ u002D')表示负值或ASCII加号'+'('\ u002B')表示正值.

但是,在Java 6中只-接受了符号.

Android SDK 21+具有JDK7依赖性,这可能是您遇到此行为的原因.


Lau*_* L. 10

它适用于Java 7之后.

Android 5引入了新的parseInt功能,如Java 7版本 - Martin Nordholts的答案点正是修订版

所以这意味着你的Lollipop使用了一个基于Java 7的更新的sdk,它也有parseInt方法和符号处理部分.

KitKat确实在Android sdk 19中引入了一些java 7功能,但不是新的parseInt.较低版本使用较早的parseInt实现(Java 6的版本),因此它们显然也会失败.


parseInt实现之间的区别: Java 6 parseInt文档Java 7 parseInt文档


fab*_*bwu 5

这是特定于Java的问题.正如您在文档中看到的那样,Java 6允许-Java 7允许+-.

使用Android版本19(KitKat)支持Java 7,因此您不会收到此错误.我建议不要使用+,因为如果你有一个负整数,你只需要一个符号.