Java Integer.valueOf为范围内的有效数字生成NumberFormatException
在Java中,我调用:Java Integer.valueOf为范围内的有效数字生成NumberFormatException,java,string,parsing,integer,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, 1
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忘记指定正确的基数,或者结果数字超出了和整数、Long等的界限,但是0x8d=141,正好在整数的界限之内
所以我的问题是,为什么会发生这种情况,我该如何解决
注意:正如您所看到的,我正在通过一个解析怪物获取chunkSizeAsString
(“8d”),并怀疑可能涉及到不可见字符。我已使用第109行上方的以下添加项检查了所述“\u200e”和“\u200f”以及所述“\\p{C}”:
chunkSizeAsString = chunkSizeAsString.replaceAll("\u200e", "");
chunkSizeAsString = chunkSizeAsString.replaceAll("\u200f", "");
chunkSizeAsString = chunkSizeAsString.replaceAll("[^\\p{Print}]", "");
但这并没有改变产出
编辑:
我使用的是jdk1.7.0_7,供应商是“Oracle Corporation”。谢谢
编辑2:
将jdk更新为1.7u79,并意识到我需要从运行和测试的服务器获取java供应商,而不是从我的家庭开发环境:
java版本“1.7.0_79”
OpenJDK运行时环境(fedora-2.5.5.0.fc20-x86_64 u79-b14)
OpenJDK 64位服务器虚拟机(构建24.79-b02,混合模式)
编辑3:
根据以下建议,我做了一些心智测试:
- 检查
和Integer.valueOf(“8d”,16)
通过的测试Integer.parseInt(“8d”,16)
为TruechunkSizeAsString.equals(“8d”)
=2chunkSizeAsString.length()
- 字符的整数值为56和100,分别为“8”和“d”的ASCII码
.valueOf
使用.parseInt
在下面,您可以执行int chunkSize=Integer.parseInt(chunkSizeAsString,16)代码>在阅读了所有这些评论之后,这里唯一有用的建议就是调试它。不用担心,按F7键(或其他任何键)并开始执行Integer.valueOf()
,这非常简单,您将立即看到出现了什么问题。在尝试对其进行一定程度的调试之后,根据您的更新和堆栈跟踪(您处于工作线程上的事实),我确信您在某种程度上混淆了调试尝试和多线程问题
将代码更改为:
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);
}
最有可能发生的情况是,您第一次尝试正确工作,通过了调试案例,然后一个稍后处理的字符串就是抛出错误的字符串
对评论的回应:似乎正在发生的是,最初的询问者正在处理大量案例的大量数据。在一个特定的案例中,他得到了无形的角色,但这不是问题第一次发生,他混淆了问题与哪个特定案例是引发问题的案例。通过隔离产生问题的解析数据片段,@Tait能够准确地调试/解析导致问题的原因,而不会被误报的情况抛出。哪个版本的Java(供应商、修订版等)?另外,尝试并转储字符串中的所有字符我已尝试遍历chunkedSizeAsString
中的所有字符,并引用每个字符(这样我会看到无法打印的字符)。只找到了“8”和“d”。您可以尝试使用更新版本的JDK吗?7u7并不完全是“新鲜的”…在您的环境中运行chunkSizeAsString
类似的程序,看看是否看到一些奇怪的东西。奇怪的检查是否正常:将字符串常量“8d”
添加到您的代码中,通过相同的解析代码发送该常量以查看其是否有效,然后执行等于(chunkSizeAsString,“8d”)
。这至少会告诉您是您读取的字符串,还是一些意外的解析行为。此外,您还提到了chunkSizeAsString
和chunkedSizeAsString
。这是问题中的一个输入错误,还是代码中有两个变量?我认为这是一个很好的建议,尽管它不是本案的罪魁祸首。@Tait@durron597伙计们,你能详细说明一下,到底发生了什么吗?异常java.lang.NumberFormatException:对于输入字符串,引发了“8d”
-为什么?即使考虑到多线程,这怎么可能呢?