NumberFormatException для входной строки, непонятно, почему?

Я сделал метод внутри класса, который должен анализировать файл в формате: имя, ххх-ххх-хххх для каждой строки. Я пытаюсь получить номер телефона, поместить каждую цифру в массив целых чисел и вернуть этот массив. Вот мой код.

Это строка, которая вызывает ошибку ---

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;
}

EDIT: предыдущий номер был 123-456-7890. Число, которое у меня было раньше, было больше, чем 2,1 миллиарда, которые может обработать java. 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)

person NewbieNick    schedule 09.11.2014    source источник
comment
Дайте нам полное и точное сообщение об ошибке.   -  person Sotirios Delimanolis    schedule 09.11.2014
comment
@DennisMeng: Лично я не думаю, что это обман. Вопрос может быть похожим, но проблема другая.   -  person Makoto    schedule 09.11.2014
comment
@Makoto Да, я понял немного после вас, что конкретный ввод, упомянутый автором, на самом деле не переполняет int. Но если бы он ввел что-то вроде 9876543210, я был бы более склонен поверить, что это обман.   -  person Dennis Meng    schedule 09.11.2014
comment
Ах. Да, теперь, когда я вижу обновленную информацию, я больше склоняюсь к тому, что это обман.   -  person Dennis Meng    schedule 09.11.2014
comment
Я не уверен. Предполагаемый результат полностью отличается от связанного дубликата.   -  person Makoto    schedule 09.11.2014
comment
Что конкретно в этом не кажется обманом? У нас есть два вопроса, оба из которых пытались проанализировать номер телефона с помощью Integer.parseInt и получили исключение NumberFormatException.   -  person Dennis Meng    schedule 09.11.2014
comment
Я это вижу, но цель другая. Этот пытается вернуть массив, содержащий каждую цифру в телефонном номере. Изменение его на длинное - не лучший способ сделать это, поскольку он действительно не отвечает на вопрос.   -  person Makoto    schedule 09.11.2014
comment
Это мой первый год программирования на java или программирования в целом. У меня нет никаких знаний о лонгах или подобных вещах. Я пытаюсь придумать разные способы решения моей проблемы.   -  person NewbieNick    schedule 09.11.2014
comment
Что ж, в любом случае было бы неплохо узнать о лонгах. Но Макото и Эллиот правы в том, что синтаксический анализ в int/long не лучший способ сделать это, учитывая, что вы хотите получить массив с одним элементом для каждой цифры.   -  person Dennis Meng    schedule 09.11.2014
comment
@Makoto Обратите внимание, что вопрос был о том, почему произошло NumberFormatException.   -  person Sotirios Delimanolis    schedule 09.11.2014


Ответы (3)


Ваш код работает здесь, единственная проблема, которую я вижу, заключается в том, что ваша формула для преобразования цифр числа 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));

который имеет то преимущество, что он будет работать с тире (и без него).

person Elliott Frisch    schedule 09.11.2014

Кроме того, вы не можете хранить номер телефона в целом числе. Он теряет как начальные нули, так и знак плюс.

Например, представьте, что вам дали номер премьер-министра Великобритании +44 20 7925 0918. Знак «плюс» означает, что это международный звонок. Он будет заменен на 011 в Североамериканском плане нумерации или на 00 в Европейское пространство нумерации телефонной связи. Как бы вы представили этот номер телефона как int?

person Breandán Dalton    schedule 09.11.2014
comment
Это урок кодирования в первом семестре... наши преподаватели не будут учитывать международные номера. - person NewbieNick; 09.11.2014
comment
Эти вопросы и ответы на них имеют долгую жизнь. Я хочу убедиться, что ни у кого из тех, кто прочитает это в будущем, не сложится впечатление, что номера телефонов можно хранить в виде целых чисел. - person Breandán Dalton; 10.11.2014

Я знаю, что этот вопрос такой старый, но до сих пор не получил ответа.

как ваше примечание:

EDIT: предыдущий номер был 123-456-7890. Число, которое у меня было раньше, было больше, чем 2,1 миллиарда, которые может обработать java. 987-654-3210 — лучший пример.

поэтому, пожалуйста, используйте Long.valueOf(str) вместо Integer.parseInt(str) или Integer.valueOf(str)

надеюсь, это поможет вам всем :)

person IRvanFauziE    schedule 11.04.2018