【问题标题】:NumberFormatException with Integer.parseInt() [duplicate]NumberFormatException 与 Integer.parseInt() [重复]
【发布时间】:2017-03-11 17:11:23
【问题描述】:

我对 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]);

请注意,当我在控制台中打印 decodedString[1] 时正确打印 1910。但是当我调用 Integer.parseInt() 时,会引发 NumberFormatException。

我也尝试在第一行使用 Integer.toString(serverPort) 或在最后一行使用 new 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)

【问题讨论】:

  • 我的直觉是你需要修剪你的输入:serverPort = Integer.parseInt(decodedString[1].trim());。没有你没有提供的堆栈跟踪很难说。
  • 如果decodedString[1] 等于"1910"Integer.parseInt 不能抛出异常。那么,如果抛出异常,这意味着什么?
  • 添加了堆栈跟踪。使用 trim() 我有相同的结果。 “1910”不等于decodedString[1]
  • 打印解码字符串[1].length()

标签: java integer byte numberformatexception parseint


【解决方案1】:

使用 Justin L 发布的解决方案我注意到我的字符串显示为:

49,57,49,48,0,0,0,0,0,0,0,0,0,0,......许多其他 0.

(0 = 空格?)

但无论如何 .trim() 不起作用。

我使用服务器发送的不同格式的字符串进行了解析。 代替: 字符串+"::"+stringVersionOfInt 我用过: 字符串+"::"+stringVersionOfInt+"::"

现在我的字符串已从 Integer.parseInt() 正确解析

这行得通! 谢谢大家!

【讨论】:

    【解决方案2】:

    我看到您的评论是 trim() 仍在提供 NumberFormatException。

    我的下一个猜测是在您的字符串中某处有一个不可见的 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 作为序列的一部分打印出来。如果您的字符串包含有效数字,那么您应该只会看到与数字相关联的相应 ASCII 代码 (http://www.asciitable.com/)。您应该会看到 1910 字符串打印为 49,57,49,48。

    【讨论】:

    • 当 Java 字符串是 UTF-16 代码单元的计数序列时,您会通过引用 ASCII 来造成混淆。此外,BOM 只是流或文件开头的 BOM。适当的阅读器不会将其带入字符串值,因为它不是数据。 (但这并不是说可以排除它是一个问题。)显然, parsetInt 没有损坏,因此,正如您所建议的,关键是找出哪些 UTF-16 代码单元正在传递给它。跨度>
    【解决方案3】:

    正如@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);
    

    【讨论】:

      猜你喜欢
      • 2018-02-23
      • 1970-01-01
      • 2011-11-13
      • 2015-07-16
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      相关资源
      最近更新 更多