【问题标题】:NumberFormatException for input String, confused as to why?输入字符串的 NumberFormatException,不知道为什么?
【发布时间】:2014-11-09 05:27:56
【问题描述】:

我在一个类中创建了一个方法,该方法应该解析具有以下格式的文件:名称,xxx-xxx-xxxx 对于每一行。我正在尝试获取电话号码并将每个数字放入一个整数数组中并返回该数组。这是我的代码。

这是导致错误的行---

theIntNumber=Integer.parseInt(justAnotherString);

如果我有:尼古拉斯·詹姆斯,912-345-6789

那么……

justAnotherString = "9123456789" 并且在尝试将字符串解析为 int 时会引发错误。我很困惑为什么会发生这种情况,它不应该从这个字符串中解析 int 吗?

感谢您的任何回答。

public int[] getPhoneNumberArray() throws FileNotFoundException
{
    Scanner scan = new Scanner(file);
    while(scan.hasNextLine())
    {
        String thePhoneNumber = "";
        String justAnotherString = "";
        int theIntNumber=0;
        String line = scan.nextLine();
        Scanner parser = new Scanner(line);
        parser.useDelimiter(",");
        parser.next();
        parser.useDelimiter(" ");
        parser.next();
        thePhoneNumber = parser.next();
        Scanner lol = new Scanner(thePhoneNumber);
        lol.useDelimiter("-");
        justAnotherString += lol.next();
        justAnotherString += lol.next();
        justAnotherString += lol.next();
        theIntNumber=Integer.parseInt(justAnotherString);

        for(int i=10;i>0;i--)
        {
            phoneNumberArray[i-1]=theIntNumber%10;
        }
    }
    for(int a=0;a<10;a++)
    {
        System.out.println("Phone Number: ");
    }
    return phoneNumberArray;
}

编辑:之前的号码是 123-456-7890。我之前的数字比java能处理的21亿还大。 987-654-3210 是一个更好的例子。

这是我遇到的错误。

Exception in thread "main" java.lang.NumberFormatException: For input string: "9876543210"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at exam2.Contact.getPhoneNumberArray(Contact.java:71)
    at exam2.ExamTwoInput.main(ExamTwoInput.java:83)

【问题讨论】:

  • 给我们完整和准确的错误信息。
  • @DennisMeng:我个人认为这不是骗人的。问题可能相似,但问题不同。
  • @Makoto 是的,我意识到作者提到的特定输入实际上并没有溢出 int。但如果他输入了类似 9876543210 的内容,那么我更倾向于认为这是一个骗局。
  • 啊。是的,现在我看到更新后的输入,我更倾向于相信这是一个骗局。
  • 我不相信。预期的结果与链接的副本完全不同。

标签: java string-parsing


【解决方案1】:

您的代码在这里工作,我看到的唯一问题是您将int 数字的数字转换为数组的公式出现了缺陷。无论如何,您不需要int,因为您将它作为justAnotherString。基本上,您可以使用 Character.digit(char, int) 之类的 -

int[] phoneNumberArray = new int[justAnotherString.length()];
for (int i = 0; i < justAnotherString.length(); i++) {
    phoneNumberArray[i] = Character.digit(justAnotherString.charAt(i), 10);
}
System.out.println(Arrays.toString(phoneNumberArray));

当然,你也可以用类似的方式解析电话号码

String line = "Nicholas James, 123-456-7890";
// get everything after the last space.
String phone = line.substring(line.lastIndexOf(' ') + 1);
phone = phone.replace("-", ""); // remove the '-' symbols
int[] phoneNumberArray = new int[phone.length()];
for (int i = 0; i < phone.length(); i++) {
    phoneNumberArray[i] = Character.digit(phone.charAt(i), 10);
}
System.out.println(Arrays.toString(phoneNumberArray));

它的优点是可以使用(和不使用)破折号。

【讨论】:

    【解决方案2】:

    顺便说一句,您不能将电话号码存储为整数。它丢失了前导零和加号。

    例如,假设您得到了英国首相的电话号码 +44 20 7925 0918。那里的加号表示该电话是国际电话。它将被North American Numbering Plan, 中的011 或European Telephony Numbering Space 中的00 替换。您如何将该电话号码表示为 int?

    【讨论】:

    • 这是第一学期的编程课......我们的教授不会考虑国际数字。
    • 这些问题及其答案有很长的寿命。我想确保以后读到这篇文章的人不会有这样的印象,即以整数形式存储电话号码是可以接受的。
    【解决方案3】:

    我知道这个问题太老了,但直到现在还没有接受答案。

    作为您的注释:

    编辑:之前的号码是 123-456-7890。我之前的数字比java能处理的21亿还大。 987-654-3210 是一个更好的例子。

    所以,请使用Long.valueOf(str) 而不是Integer.parseInt(str)Integer.valueOf(str)

    希望对大家有帮助:)

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      相关资源
      最近更新 更多