【问题标题】:Integer.parseInt and NumberFormatException on AndroidAndroid 上的 Integer.parseInt 和 NumberFormatException
【发布时间】: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 方法。

标签: java android


【解决方案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 documentationJava 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 版本。
猜你喜欢
  • 1970-01-01
  • 2017-03-11
  • 2017-01-26
  • 2018-02-23
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
相关资源
最近更新 更多