Java Integer.valueOf为范围内的有效数字生成NumberFormatException

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

在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忘记指定正确的基数,或者结果数字超出了和整数、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)
    通过的测试
  • chunkSizeAsString.equals(“8d”)
    为True
  • chunkSizeAsString.length()
    =2
  • 字符的整数值为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”
    -为什么?即使考虑到多线程,这怎么可能呢?