【问题标题】:Java NumberFormatException?Java NumberFormatException?
【发布时间】:2013-12-22 04:28:15
【问题描述】:

好吧,我很无聊,所以我想做一个二进制>十进制转换器。我将转换器的上限设置为 30 位数 (1073741823) 或 (011111111111111111111111111111)。我遇到的问题是,当我尝试解析 111111111111111111111111111111 时,我得到了 NumberFormatException。这是一些代码:

此代码负责检查字符串是否为数字,而不是将其解析为 int。

if (checkNumber(input)) {
        try {
        number = Integer.parseInt(input);
        } catch (NumberFormatException ex) {
            log(ex.getMessage());
        }
    } else {
        toDecimal();
    }

这是检查字符串的实际布尔值。

private static boolean checkNumber(String input) {
    for (char c : input.toCharArray()) {
        if (!Character.isDigit(c)) {
            return false;
        }
    }

    return true;
}

这是 NumberFormatException 的输出:

java.lang.NumberFormatException: For input string: "111111111111111111111111111111"

我只是不明白为什么 Java 会抛出这个错误。有什么想法吗?

Integer.parseInt(String, 2);是正确的答案。

【问题讨论】:

标签: java binary decimal


【解决方案1】:

因为Integer.parseInt(String) 默认以 10 为底。

您需要使用Integer.parseInt(String, int) 并为您尝试解析的值指定正确的基数。对于二进制(以 2 为基数),这将是 2

int value = Integer.parseInt("00010010", 2);

【讨论】:

    【解决方案2】:

    Java 中整数的大小为 -2,147,483,648 到 2,147,483,647。你的输入超过了。

    你可以尝试使用long,最大值为9,223,372,036,854,775,807。

    也许您应该考虑使用 BigInteger。

    编辑:我的错,没有注意到您要解析二进制文件,应该更仔细地阅读。

    【讨论】:

      【解决方案3】:

      因为您的字符串表示不是对位。它正在解析 30 个以 10 为基数的数字,这肯定不适合 int 数据类型。如果要解析base 2,需要传入radix参数给parseInt

      【讨论】:

        【解决方案4】:

        它被解析为十进制,但您需要将其解析为二进制。将其标记为binary

        number = Integer.parseInt(input,2);
        

        http://ideone.com/G6dqj6 中,您将按预期获得 1073741823

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-25
          • 2014-11-06
          • 1970-01-01
          相关资源
          最近更新 更多