【问题标题】:NumberFormatException error (parseInt)NumberFormatException 错误 (parseInt)
【发布时间】:2011-07-13 03:22:17
【问题描述】:

希望是一个非常简单的查询,但它让我摸不着头脑。

我有一个字符串,它只是一个整数,然后我试图将该整数作为 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)

【问题讨论】:

  • 逐个字符打印我们的字符串,看看是否有什么有趣的地方

标签: java string integer numberformatexception


【解决方案1】:

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

执行data.toCharArray() 并打印每个字符的代码(转换为int)。例如,可能会发现在数字之前有一个隐藏字符。 (编辑:似乎 iluxa 在我写答案时在评论中提到了这个选项)

在传递给parseInt(..)之前尝试data = data.trim()

【讨论】:

  • 这就是我的想法,但是当我输出该数组时,我得到的只是一个数组,其中包含一个零元素,即 49 (1),其余为空 (0)。我可以发送不同的数字而不是 1,然后我会将该数字表示为您所期望的一系列 ascii 字符,这些字符映射到正确的数字,然后是 0。 Java中是否存在某种可能被getData方法忘记的空字符?
【解决方案2】:

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

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

接收的数据或要发送的数据从缓冲区中的offset开始,并运行length long。

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

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

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

【讨论】:

  • 完美 - 我意识到 0 把它搞砸了(我假设当 parseInt() 方法达到 0 时它会停止,像 /0 一样对待它)所以使用了一个解决方法循环,但这很好 - 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
相关资源
最近更新 更多