Java Integer.valueOf为范围

时间:2015-04-26 21:37:32

标签: java string parsing integer

在Java中,我打电话:

String chunkSizeAsString = responseString.split(DOUBLE_NEW_LINE)[1]
    .split(SINGLE_NEW_LINE)[0];
System.out.println("Trying to get integer value of '" + chunkSizeAsString + "'");
Integer chunkSize = Integer.valueOf(chunkSizeAsString, 16); // this is line 109

获得输出:

Trying to get integer value of '8d'
Exception in thread "Thread-2" java.lang.NumberFormatException: For input string: "8d"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:481)
    at java.lang.Integer.valueOf(Integer.java:556)
    at ProxyWorker.handleRequest(ProxyWorker.java:109)
    at ProxyWorker.run(ProxyWorker.java:41)
    at java.lang.Thread.run(Thread.java:745)

基本上,我打电话给Integer.valueOf("8d", 16)并收到NumberFormatException。我已经看到很多例子,其中OP忘记指定正确的基数,或者结果数字超出了Integer,Long等的界限。但是0x8d = 141,这很容易在整数的范围内。 / p>

所以我的问题是,为什么会发生这种情况,我该如何解决?

N.B。正如你所看到的,我通过解析怪物获得chunkSizeAsString(“8d”),并怀疑可能涉及隐形字符。我已按照here检查了“\ u200e”和“\ u200f”,并在第109行上方使用以下添加here检查了“\\ p {C}”:

chunkSizeAsString = chunkSizeAsString.replaceAll("\u200e", "");
chunkSizeAsString = chunkSizeAsString.replaceAll("\u200f", "");
chunkSizeAsString = chunkSizeAsString.replaceAll("[^\\p{Print}]", ""); 

但这并没有改变输出。

修改 我使用的是jdk1.7.0_7,供应商是'Oracle Corporation'。感谢fge

编辑2: 更新了jdk到1.7u79,并意识到我需要从我正在运行和测试的服务器上获取java供应商,而不是我的家庭开发环境:

  

java版“1.7.0_79”

     

OpenJDK运行时环境(fedora-2.5.5.0.fc20-x86_64 u79-b14)

     

OpenJDK 64位服务器VM(内置24.79-b02,混合模式)

编辑3: 根据建议,我做了一些健全测试:

  • 检查Integer.valueOf("8d", 16)Integer.parseInt("8d", 16)传递
  • 的测试
  • chunkSizeAsString.equals("8d")为True
  • chunkSizeAsString.length() = 2
  • 字符的整数值分别为56和100,分别是“8”和“d”的ASCII码,

3 个答案:

答案 0 :(得分:3)

尝试在一定程度上调试它,并且,根据您的更新和您的堆栈跟踪(您在工作线程上的事实),我确信您在某种程度上混淆了您尝试使用多线程问题进行调试

将您的代码更改为:

String

最有可能发生的事情是,您正在进行第一次尝试正常工作,传递调试用例,然后后来处理的ProgressBar就是抛出错误的那个。

对评论的回应:似乎正在发生的事情是原始提问者正在处理大量案件中的大量数据。在一个特定的案例中,他正在获得隐形角色,但这不是问题发生的第一次时间,而且他将问题与哪个特定案例引发问题混淆了。通过隔离哪一段解析数据产生问题,@ Tait能够正确地调试/解析导致它的原因,而不会被误报情况抛弃。

答案 1 :(得分:1)

阅读完所有这些评论后,这里唯一有用的建议就是 - 只需 debug 即可。不要害怕,按F7(或其他任何内容)并进入Integer.valueOf()的实施,它非常简单,您将立即看看出了什么问题。

答案 2 :(得分:0)

.valueOf使用下方的.parseInt,您可以执行int chunkSize = Integer.parseInt(chunkSizeAsString, 16);