希望这是一个非常简单的查询,但这让我感到头疼。
我有一个字符串,它只是一个整数,我试图将该整数作为一个整数输出。从表面上讲这应该不是问题。
// this is how I create the string (it's the playload from a UDP datagram packet,
// thought I don't think the origins hugely important - it's juts a test run so the
// stringMessage is always 1 (created by a seperate client process)
...
recvSoc.receive(pac);
String stringMessage = new String(pac.getData());
port = pac.getPort();
System.out.println("RECEIVED: " + stringMessage + " on port: " + port);
processMessage(stringMessage);
...
// Then in processMessage
public void processMessage(String data) {
int message;
message = Integer.parseInt(data);
...
这总是因NumberFormatException错误而崩溃。我无法为我的生活弄清楚是什么导致了这一点,任何想法都非常感激。我在Java(最近)中编写的代码不多,所以可能只是忘记了一些关键的东西或者什么不是。
Exception in thread "main" java.lang.NumberFormatException: For input string: "1"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:481)
at java.lang.Integer.parseInt(Integer.java:514)
at udp.UDPServer.processMessage(UDPServer.java:85)
at udp.UDPServer.run(UDPServer.java:52)
at udp.UDPServer.main(UDPServer.java:156)
答案 0 :(得分:5)
如果字符串真的是1
,则不会发生异常。所以我会说字符串实际上不是1
。
执行data.toCharArray()
并打印每个角色的代码(强制转换为int
)。例如,可能会发现数字前面有一个隐藏的字符。 (编辑:在我写答案时,似乎iluxa在评论中提到了这个选项)
在将data = data.trim()
传递给parseInt(..)
答案 1 :(得分:4)
请注意,DatagramPackate.getData()
会返回整个缓冲区!
您收到的数据只是其中的一部分:
收到的数据或要发送的数据从缓冲区中的
offset
开始,并且运行length
长。
因此,要将数据转换为String
,您应该使用this constructor:
String message = new String(pac.getData(), pac.getOffset(), pac.getLength(), "UTF-8");
请注意,我在这里指定了UTF-8编码,因为没有指定编码会导致使用平台默认编码,这通常不是你想要的。