Integer.parseInt()

时间:2016-10-28 18:42:31

标签: java integer byte numberformatexception parseint

我对Integer.parseInt()有疑问。 特别是我的代码执行此操作:

serverPort变量是一个正确初始化为1910的int

byte[] multicastMessage = (serverAddress+"::"+String.valueOf(serverPort)).getBytes();

byte[] receivedBytes = receivePacket.getData();
receivedString = new String(receivedBytes, "UTF-8");

String[] decodedString = receivedString.split("::");            
serverPort = Integer.parseInt(decodedString[1]);

请注意,当我在控制台中打印decodeString [1]时,正确打印1910.但是当我调用Integer.parseInt()时,会引发NumberFormatException。

我也尝试在第一行使用Integer.toString(serverPort)或在最后一行使用新的Integer(encodedString [1])。intValue()但没有成功。

我怀疑使用byte生成转换问题(我无法避免),但我对字节结构并不熟悉。

编辑:

Exception in thread "Thread-0" java.lang.NumberFormatException: For input string: "1910"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at ClientThread.run(ClientThread.java:60)

3 个答案:

答案 0 :(得分:1)

我看到你的评论,trim()仍然提供NumberFormatException。

我的下一个猜测是你的String中某处有一个不可见的ASCII字符,例如BOM(bye order mark)。检查这个的最好方法是通过以下函数运行字符串:

public static String displayCharValues(String s) {
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
    sb.append((int) c).append(",");
}
return sb.toString();}

如果存在BOM,那么您将看到65279作为序列的一部分打印出来。如果您的String包含有效数字,那么您应该只看到与数字(http://www.asciitable.com/)相关联的相应ASCII代码。您应该看到您的1910字符串打印为49,57,49,48。

答案 1 :(得分:0)

正如@azurefrog指出的那样,这可能是一个空白问题。以下程序正确解析:

    String receivedString = "host::1910";

    String[] decodedString = receivedString.split("::");

    int serverPort = Integer.parseInt(decodedString[1]);

    System.out.println(serverPort);

但是,如果你在1910年之前添加空格,那么它会像你指示的那样抛出NumberFormatException。解决方案是使用String.trim删除任何空格。

    String receivedString = "host:: 1910";

    String[] decodedString = receivedString.split("::");

    int serverPort = Integer.parseInt(decodedString[1].trim());

    System.out.println(serverPort);

答案 2 :(得分:0)

使用Justin L发布的解决方案我注意到我的字符串显示为:

49,57,49,48,0,0,0,0,0,0,0,0,0,0,......许多其他人0。

(0 =空格?)

但无论如何.trim()不起作用。

我使用服务器发送的不同格式的字符串解决了问题。 代替: 字符串+ “::” + stringVersionOfInt 我用过: 串+ “::” + stringVersionOfInt + “::”

现在我的字符串是从Integer.parseInt()

中正确解析的

那是有效的! 谢谢大家!