我有一个问题与Integer.parseInt()。特别是我的代码是这样做的:
serverPort变量是一个int类型,正确初始化为1910
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]);
注意,当我在控制台中打印decodedString[1]时,正确打印的是1910。但是当我调用Integer.parseInt()时,会引发NumberFormatException。
我也尝试使用Integer. tostring (serverPort)在第一行或使用新的Integer(decodedString[1]). intvalue()在最后一行没有成功。
我怀疑转换问题产生使用字节(我无法避免它),但我不太熟悉字节结构。
编辑: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)
我看到你的评论,trim()仍然提供NumberFormatException。
我的下一个猜测是,有一个不可见的ASCII字符,如BOM(再见订单标记)在你的字符串的某个地方。检查这一点的最佳方法是通过以下函数运行字符串:
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作为序列的一部分打印出来。如果你的字符串包含有效的数字,那么你应该只看到与数字相关联的相应ASCII码(http://www.asciitable.com/)。您应该看到1910字符串打印为49,57,49,48。
正如@azurefrog指出的,这可能是一个空白问题。下面的程序可以正确解析:
String receivedString = "host::1910";
String[] decodedString = receivedString.split("::");
int serverPort = Integer.parseInt(decodedString[1]);
System.out.println(serverPort);
但是,如果您在1910之前添加空格,则会抛出您所指示的NumberFormatException
。解决方案是使用String。修剪以删除任何空白。
String receivedString = "host:: 1910";
String[] decodedString = receivedString.split("::");
int serverPort = Integer.parseInt(decodedString[1].trim());
System.out.println(serverPort);
使用Justin L发布的解决方案。我注意到我的字符串显示为:
49, 57岁,49岁,48岁,0,0,0,0,0,0,0,0,0,0,……
(0 = blank spaces?)
但无论如何。trim()不起作用。
我使用服务器发送的不同格式的字符串进行了解析。而不是:字符串+"::"+ stringVersionOfInt我使用:字符串+"::"+ stringVersionOfInt +"::"
现在我的字符串从integer正确解析。parseint ()
的作品!谢谢大家!