在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忘记指定正确的基数,或者结果数超出了and Integer,Long等的范围。但是0x8d = 141,可以轻松地位于Integer的范围之内。所以我的问题是,为什么会这样,我该如何解决?
N.B.如您所见,我通过解析怪物得到
chunkSizeAsString
(“8d”),并且怀疑其中可能包含不可见的字符。我已经在第109行中使用以下添加项检查了here中提到的“\ u200e”和“\ u200f”,以及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 最佳答案
在尝试进行一定程度的调试之后,并给出了更新信息和堆栈跟踪信息(您在工作线程中),我确信您在某种程度上将调试尝试与多线程问题混淆了。
将代码更改为此:
private final AtomicInteger attemptCounter = new AtomicInteger(0);
void whateverYourMethodIsCalled(String responseString) {
int attemptId = attemptCounter.incrementAndGet();
System.out.format("Beginning attempt: %d%n", attemptId);
String chunkSizeAsString = responseString.split(DOUBLE_NEW_LINE)[1]
.split(SINGLE_NEW_LINE)[0];
System.out.format("In attempt %d, trying to get integer value of '%s', which is length %d%n",
attemptId, chunkSizeAsString, chunkSizeAsString.length());
Integer chunkSize = Integer.valueOf(chunkSizeAsString, 16); // this is line 109
System.out.format("Ending attempt: %d%n", attemptId);
}
最有可能发生的情况是,您将首先尝试正确运行,并通过调试用例,然后再处理
String
,这将引发错误。对评论的回应:似乎正在发生的事情是原始询问者正在处理大量案例中的大量数据。在一个特定的案例中,他获得了隐形角色,但这不是问题第一次发生,而且他使问题与引发该问题的特定案例相混淆。通过隔离哪个解析数据产生了问题,@ Tait能够准确地调试/解析导致问题的原因,而不会被误报情况所抛弃。