Android 上的 Integer.parseInt 和 NumberFormatException
Posted
技术标签:
【中文标题】Android 上的 Integer.parseInt 和 NumberFormatException【英文标题】:Integer.parseInt and NumberFormatException on Android 【发布时间】:2015-07-16 06:50:45 【问题描述】:我在我的 android 应用中运行了以下代码
Integer.parseInt("+91");
在Android 5.0(棒棒糖)中,它没有抛出任何异常,因为+91
是一个整数。但在Android 4.4.x (KitKat) 及更低版本中,它会抛出:
NumberFormatException : Invalid Int : "+91"
Android 版本是如何造成这种差异的?
【问题讨论】:
这出现在哪个特定的 API 中? API-21 还是 API-22? 这是一个错误。文档说明 + 和 - 被允许作为加号和减号.. 或者文档可能是错误的 很奇怪,因为parseInt()
是 Java 方法,而不是 Android SDK 方法。
【参考方案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 的行为,正如其他答案所指出的那样),但分析源代码的历史可以为提供最准确的答案>当行为发生变化时,因为文档不一定与实现相匹配。
【讨论】:
@MartinNordholts :提交表明更改是在 decode() 中进行的。但是 parseInt() 不使用 decode() 提交确实改变了parseInt(String)
,但是是间接的。查看标记为@@ -350,19 +354,17 @@
的块。这是对Integer.parseInt(String string, int radix)
的更改,由parseInt(String string)
调用
@MartinNordholts:是的,你是对的。我想你已经给出了最正确的答案。 Android 使用它自己的 JAVA 实现。查看 Oracle Java 文档是没有意义的。您能否在您的答案中添加上述信息?(将帮助在 Oracles 文档中搜索答案的人)。无论如何,我会接受答案。【参考方案2】:
这种行为实际上是 Java 7 的一部分,就像 docs 状态:
将字符串参数解析为有符号十进制整数。那些角色 在字符串中必须都是十进制数字,除了第一个 字符可以是 ASCII 减号 '-' ('\u002D') 来表示 负值或 ASCII 加号 '+' ('\u002B') 表示 正值。
然而,在 Java 6 中只接受 -
符号。
Android SDK 21+ 具有 JDK7 依赖项,这大概就是您遇到这种行为的原因。
【讨论】:
Android 不使用 JVM。它使用自己的 VM Dalvik Vm 用于 kitkat 及以下版本和 ART vm 用于 Lollopop 及以上版本。所以,我认为我们不应该在这里参考 Oracle 的文档 @Ashwin 取决于。如果它声称是 Java,至少 Laguage Specs 应该是相同的。但是,如果这也适用于库调用,那我就不知道了。【参考方案3】:它在 Java 7 之后工作。
Android 5 像 Java 7 版本一样引入了新的 parseInt 功能 - Martin Nordholts's answer points exactly the revision
所以这意味着你的 Lollipop 使用了基于 Java 7 的更新的 sdk,它也有带有符号处理部分的 parseInt 方法。
KitKat 确实将some java 7 features 引入了 Android sdk 19,但没有引入新的 parseInt。较低版本使用 parseInt(Java 6 的版本)的早期实现,因此它们显然也会失败。
parseInt 实现的区别: Java 6 parseInt documentation 与 Java 7 parseInt documentation
【讨论】:
据我所知,java版本与Android API级别无关。如果我错了,请纠正我。 他们在 KitKat tools.android.com/tech-docs/new-build-system/…987654325@之后引入了 java 7 特性 在链接中找不到那个 那不谈java 该链接在讨论新引入的对 java 7 的支持的论坛上被引用,实际上它不在普通的 java 上下文中(最后提到了 java 7 支持)。 java 7 和 android kitkat 之间更清晰的联系:moonlightbox.logdown.com/posts/2015/04/17/…。【参考方案4】:这是一个特定于 Java 的问题。正如您在文档中看到的,Java 6 允许 -
和 Java 7 允许 +
或 -
。
Android 版本 19 (KitKat) 支持 Java 7,因此不会出现此错误。我建议不要使用+
,因为只有负整数才需要符号。
【讨论】:
Android 不使用 JVM。它使用自己的 VM Dalvik Vm 用于 kitkat 及以下版本和 ART vm 用于 Lollopop 及以上版本。所以,我认为我们不应该在这里参考 Oracle 的文档 我同意这一点。但 Android 将 Java-Sourcecode 编译为 Java-Bytecode,然后编译为 Dalvik-Bytecode(或 ART),因此 API 几乎相同。此外,我认为这种解释比 android 源代码中的任何 git diff 都容易。 你的解释其实是错误的。您说“Android 版本 19 (KitKat) Java 7,所以您不会收到此错误”。但是我在 kitkat 中遇到了错误。再次阅读我的问题“但在 KitKat 和更低版本中......” 所以,如果 java 7 允许 + 和 - 并且 kitkat 使用 Java7,那么在 kitkat 中不应该发生错误。但确实如此。因为android使用它自己的java版本。 Android 19??最新版本是5.1.1,KitKat 是 4.4 - 4.4.4 版本。以上是关于Android 上的 Integer.parseInt 和 NumberFormatException的主要内容,如果未能解决你的问题,请参考以下文章