在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 答案 0 :(得分:3)
尝试在一定程度上调试它,并且,根据您的更新和您的堆栈跟踪(您在工作线程上的事实),我确信您在某种程度上混淆了您尝试使用多线程问题进行调试
将您的代码更改为:
String
最有可能发生的事情是,您正在进行第一次尝试正常工作,传递调试用例,然后后来处理的ProgressBar
就是抛出错误的那个。
对评论的回应:似乎正在发生的事情是原始提问者正在处理大量案件中的大量数据。在一个特定的案例中,他正在获得隐形角色,但这不是问题发生的第一次时间,而且他将问题与哪个特定案例引发问题混淆了。通过隔离哪一段解析数据产生问题,@ Tait能够正确地调试/解析导致它的原因,而不会被误报情况抛弃。
答案 1 :(得分:1)
阅读完所有这些评论后,这里唯一有用的建议就是 - 只需 debug 即可。不要害怕,按F7(或其他任何内容)并进入Integer.valueOf()
的实施,它非常简单,您将立即看看出了什么问题。
答案 2 :(得分:0)
.valueOf
使用下方的.parseInt
,您可以执行int chunkSize = Integer.parseInt(chunkSizeAsString, 16);