【问题标题】:BigInteger NumberFormatException on valid big binary string有效的大二进制字符串上的 BigInteger NumberFormatException
【发布时间】:2012-11-25 02:09:29
【问题描述】:

所以,我使用 BigInteger 将一些二进制字符串转换为数字表示,结果卡在了一个奇怪的错误上。

当这行代码运行时,它会引发 NumberFormatException:

BigInteger temp = new BigInteger(strbuf.toString(), 2);

其中 strbuf 具有以下字符串(仅由零和一组成):

"1001110000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010"

起初我以为字符串或值可能太大了,但以下独立的 java 类编译并运行得很好:

import java.math.BigInteger;

class test {
    public static void main(String[] argv) {
        StringBuffer strbuf = new StringBuffer("1001110000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010");
        BigInteger big = new BigInteger(strbuf.toString(), 2);
        System.out.println(big);
    }
}

这里有什么我遗漏的吗?为什么具有明显相同值的相同代码无法在我的主应用程序上运行?

异常信息:

Exception in thread "main" java.lang.NumberFormatException: For input string: "1001110000000100"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.math.BigInteger.<init>(Unknown Source)
    at org.app.star.pad(star.pad:42)

【问题讨论】:

  • 输入中有不可见的空格?
  • 然在IdeOne代码(ideone.com/GuJLLC),并得到了下面的输出(所以我用@JanDvorak - 必须有一些我们看不到的,像空格):417930212607612468737110316986879612439672931440615354309603422963982626776659655589632258299793872789220031604756569181620845534282724833020726590169395583661276012623515415583708710670108499420513173862492847862152600326386627711243234204303044817195286706366016107594099186988482244150662103889346562 SPAN>
  • 更准确地说,我猜0100 后面有一个换行符。请注意,输入在此位置被截断。
  • 可能你的数字有误。我和其他人一样没有错误。
  • 为了进一步澄清,在帖子中复制的原始字符串来自一种仅从 0 和 1 创建字符串的方法。在该 sn-p 中运行的方法(及其在此处工作)也)从屏幕上显示的内容复制(使用剪贴板)。正如 Jan Dvorak 建议的那样,我将使用正则表达式检查原始字符串中的任何控制字符。

标签: java string biginteger numberformatexception


【解决方案1】:

根据我的 j2ee5 Safari book,有一个尝试(隐式 建议)将值转换为 java.lang.Integer,它是 整数类型。那就是问题所在。注意异常中的第二个“at”行 放松...

这可能是一个优化问题..关闭您的主要优化 程序不是精简的演示程序。

此致,

ArrowInTree

【讨论】:

  • 我该怎么做呢?我在 javac 中没有看到任何关于优化的选项或标志,我也用谷歌搜索了它并没有发现任何开关..
  • umm "man java" on linux...尝试-esa(启用系统断言)或-ea(启用非系统断言)和/或-Xint(仅解释模式...无字节码编译)等。
  • 我明白了.. 我一直在寻找 javac 开关而不是 java.. 我仍然尝试了您建议的标志组合,并且还查看了“XX”,但仍然停留在相同的异常中。不过还是谢谢。
  • 您是否尝试过使用 -g 选项将调试器 (jdb) 编译出来?如果您可以获得源代码,请将其包含在调试器的命令行中,或者只需下载 eclipse..?
  • 目前我仅限于封闭的 JDK,我有兴趣在其中运行我的代码;使用 OpenJDK 访问源代码并不是一个很好的选择,尽管看到结果的差异会很有趣。我已经在使用 jdb btw,但是由于我没有源代码,因此无法访问 Integer.parseInt 或其中发生的事情。
猜你喜欢
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
相关资源
最近更新 更多