【问题标题】:NumberFormatException for valid number String有效数字字符串的 NumberFormatException
【发布时间】:2013-11-14 13:38:33
【问题描述】:

我正在制作一个需要通过互联网接收数据的程序。它使用 DatagramSockets 并接收 DatagramPackets 这样做。这一切都很好,它接收到的字节数组正是我所期望的。

但是,当我尝试将字节数组转换为字符串,然后再转换为整数时,会发生非常奇怪的事情。

运行下面的代码会在 parseInt 行产生 NumberFormatException:

String length = new String(data, 1, data.length-1);
System.out.println("length = "+length);
size = Integer.parseInt(length);
System.out.println("size = "+size);

但是,当我检查data 的内容时,我发现它只包含55,52,49,56,53,0,0,0,0,0,0,0,0,0,0,0,0,这很好,它是字符串“74185”。但这会引发异常。

当我将“74185”硬编码为length 字符串时,一切正常。

这里可能出了什么问题?

【问题讨论】:

  • 您确定对从网络读取的字节数给予了适当的关注吗?您是否考虑过将显式编码传递给 String 构造函数?您是否以十六进制格式一次一个字符地转储了字符串?

标签: java string datagram parseint


【解决方案1】:

失败是因为你使用了错误的构造函数。这是String(byte\[\],index,length)。第一个参数data 是正确的。第二个应该是0(数组的开头是0),第三个应该是data.length

您可以只使用new String(data) 来代替使用整个数组。

编辑:正如 Roland Illig 指出的那样,您的数组包含 \0 字符,这会破坏您的号码。您应该在调用之前摆脱那些\0s,或者检查第一个\0的索引并将其用作上述构造函数+1的第三个参数。

无论如何,如果你想发送一个数字,为​​什么不发送一个数字而不是你必须解析的字符串?

【讨论】:

  • 那行不通,因为字符串仍将包含\0 字符。
【解决方案2】:

您的字符串包含嵌入的\0 字符。在 Java 中,它们是字符串的一部分,而不是在 C 中。

所以你首先需要在字符串中找到\0的第一次出现,然后将子字符串带到那个位置。

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 2012-11-25
    • 2016-03-26
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多