2011-03-10 94 views
4

希望一个非常简单的查询,但它留给我抓我的头。NumberFormatException的错误(parseInt函数)

我有一个字符串,这仅仅是一个整数,我试图再拿到该整数出来作为一个int。这面对它应该不成问题。

// 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) 
+1

由字符打印我们您的字符串的字符,并看看是否有什么好笑有 – iluxa 2011-03-10 23:37:40

回答

4

注意DatagramPackate.getData()返回整个缓冲区

尝试data = data.trim()

您接收到的数据仅是其中的一部分:

接收到的数据或数据缓冲区中发送时offset启动,并运行length长。

所以将数据转换为String,你应该使用this constructor

String message = new String(pac.getData(), pac.getOffset(), pac.getLength(), "UTF-8"); 

请注意,我在这里指定的UTF-8编码,不指定编码会导致平台的默认编码被使用,这通常不是你想要的。

+0

完美 - 我实现了0被搞乱了这一切(我曾以为当parseInt函数()方法达到0它只是停止,治疗它像一个/ 0),因此得到了使用循环解决方法,但这是很多不错的 - 不胜感激! – Alex 2011-03-11 11:28:00

5

如果字符串确实是1,则不会发生异常。所以我会说这个字符串实际上并不是1

做一个data.toCharArray()并打印每个字符的代码(投到int)。例如,可能会发现在数字之前存在隐藏的字符。 (编辑:看来iluxa在评论中提及了这个选项,而我写的答案),它传递给parseInt(..)

+0

所以这就是我的想法,但是当我输出该数组我得到的是包含单个元素的数组以零,这是49(1),然后剩下的都是空的(0)。我可以发送不同的数字,而不是1,再次,我得到这个数字代表你所期望的一系列的ASCII字符其映射到正确的号码,然后0。在Java中有没有可能是getData方法已经被遗忘的某种空字符? – Alex 2011-03-11 06:56:54

+1

@ash - 你不应该有任何的零1.请参阅更新后。 – Bozho 2011-03-11 07:42:46