在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
  • 字符的
  • 整数值分别为56和100,分别是“8”和“d”的ASCII码,均为
  • 最佳答案

    在尝试进行一定程度的调试之后,并给出了更新信息和堆栈跟踪信息(您在工作线程中),我确信您在某种程度上将调试尝试与多线程问题混淆了。

    将代码更改为此:

    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能够准确地调试/解析导致问题的原因,而不会被误报情况所抛弃。

    09-28 02:19