我对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)
答案 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()
中正确解析的那是有效的! 谢谢大家!