Java NumberFormatException при использовании Integer.parseInt - PullRequest
0 голосов
/ 22 февраля 2019

Я действительно искал ответ по всему Интернету, прежде чем приехать сюда, и я думаю, что ответ будет как-то связан с операторами try / catch, но даже после просмотра пары учебников по этой теме я не уверен вкак это реализовать.

В любом случае, я пытаюсь сделать простую вещь в своем приложении для напоминаний новичка, которое я создаю (я изучаю Java как мой первый язык уже около 3 месяцев).

Я хочу, чтобы программа проверяла ввод пользователя, и, если это определенная буква («R»), я хочу, чтобы программа делала определенные вещи.Если это целое число от 0 до 100, то я хочу заняться другими делами.И если это ни один из них, то я хочу, чтобы оператор "else" работал.

Проблема, из-за которой я не могу заставить работать оператор "else", когда я получаю ошибку NumberFormatException.Например, если я ввожу какую-то другую букву, например, "d", я получаю следующее сообщение об ошибке:

Исключение в потоке "main" java.lang.NumberFormatException: Для входной строки: "d" в java.lang.NumberFormatException.forInputString (NumberFormatException.java:65) в java.lang.Integer.parseInt (Integer.java:580) в java.lang.Integer.parseInt (Integer.java:615) в mash.Dialogue.startDialogue (диалог диалога).java: 51) в mash.Dialogue.newRem (Dialogue.java:27) в mash.Dialogue.startDialogue (Dialogue.java:38) в mash.Dialogue.start (Dialogue.java:13) в mash.Main.main(Main.java:9)

Вот код (прошу прощения за любые проблемы с читабельностью, я впервые показываю свой код кому-то).Вам не нужно читать инструкцию else if, поскольку проблема, похоже, не зависит от текста внутри этого утверждения.

Я был бы очень признателен, если бы кто-нибудь мог указать мне, что не так с кодом и какЯ бы сделал то, что хотел.Мы будем признательны за новшество, подходящее для новичков.

Заранее спасибо!

String secondLetter = mash.nextLine();
           if(secondLetter.equals("r") || secondLetter.equals("R")) {  //if the user enters R - create a new Reminder
             newRem();
    }
           else if((Integer.parseInt(secondLetter) >= 0) && (Integer.parseInt(secondLetter) < maximum)) { //if the user enters number - check task list
               tasks.remText(Integer.parseInt(secondLetter));
               System.out.println("Enter 'D' to set the reminder as Done. Or enter 'T' to return to the list");
               String v = mash.nextLine();
               System.out.println(v);
               if(v.equals("d")|| v.equals("D")) { //if user enters D - set the reminder as done
                   tasks.setDone(Integer.parseInt(secondLetter));
                   System.out.println("The reminder is now added to 'Done' list");
               }
               else if(v.equals("t")|| v.equals("T")) { //if user enters T - return to the list of reminders
                   tasks.display();

               }
               else {

                       System.out.println("Please enter the correct symbol");

               }
           }

           else {     
               System.out.println("Enter the correct symbol");

           }

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Вы можете проверить правильность ввода, прежде чем пытаться преобразовать его.Например:

if(!secondLetter.matches("[0-9]+")) {
   //it's not a number, so dont attempt to parse it to an int
}

поместите его в свой if / else так:

if(secondLetter.equals("r") || secondLetter.equals("R")) {
  newRem();
} else if(!secondLetter.matches("[0-9]+")){
  System.out.println("please type r or R or a number");
} else if((Integer.parseInt(secondLetter) >= 0) && ...
0 голосов
/ 22 февраля 2019

Краткий ответ: docs.oracle.

Полный ответ: Вы можете использовать Integer.parsInt (String s) только для строки, которая может быть проанализирована в целое число.Буква «R» не может быть числом, поэтому она генерирует исключение.

if(Character.isLetter(secondLetter) && "R".equalsIgnoreCase(secondLetter)){
   do code with "R"
}else if(Integer.parseInt(secondLetter) > 0 && Integer.parseInt(secondLetter) < 100){
   do code with 0 < number < 100
}else{
   do something else
}
0 голосов
/ 22 февраля 2019

Integer.parseInt всегда выдает исключение, если вы пытаетесь использовать его с чем-то, что не является int.И «d» не является int.Поэтому вам следует заключить это в блок try / catch и запросить у пользователя другой ввод, если он введет что-то недопустимое.

...