Получение исключения в потоке «main» java.util.Исключение InputMismatchException

#java #inputmismatchexception

#java #исключение inputmismatchexception

Вопрос:

Я пытаюсь принимать входные данные один за другим, а затем пытаюсь выполнять операции над ними. Следуя моему коду.

    import java.util.Scanner;

    public class PlayerRoster {
       public static void main(String[] args) {
          Scanner scnr = new Scanner(System.in);
      
          final int LENGTH = 5;
          final char quit = 'q';
          char uin = 'z';
          int jersey = 0;
          int chng = 0;
      
          int[] number = new int[LENGTH];
          int[] rating = new int[LENGTH];
      
          for(int i = 0; i < LENGTH; i  ){
             System.out.println("Enter player " (i 1) "'s jersey number:");
             number[i] = scnr.nextInt();
             System.out.println("Enter player " (i 1) "'s rating:n");
             rating[i] = scnr.nextInt();
          }
          for(int i = 0; i < LENGTH; i  ){
             if (i == 0)
                System.out.println("ROSTER");
      
                 System.out.println("Player "   (i   1)   " -- Jersey number: "   (number[i])   ", Rating: "   (rating[i]));
             if (i == 4)
                System.out.println("");
      
          }
          while (uin != quit){
         
             System.out.println("MENU");
             System.out.println("u - Update player rating");
             System.out.println("a - Output players above a rating");
             System.out.println("r - Replace player");
             System.out.println("o - Output roster");
             System.out.println("q - Quitn");
       
             System.out.println("Choose an option:");
              uin = scnr.next().charAt(0);
      
             if (uin == 'o')
                for(int i = 0; i < LENGTH; i  ){
                   if (i == 0)
                      System.out.println("ROSTER");
                      System.out.println("Player "   (i   1)   " -- Jersey number: "   (number[i])   ", Rating: "   (rating[i]));
                   if (i == 4)
                      System.out.println("");
                }
         
         
             if (uin == 'u')
                System.out.println("Enter a jersey number: ");
                   chng = scnr.nextInt();
         
          }  
       }
    }
  

В настоящее время я не сосредоточен на логике, поскольку я не могу принимать входные данные, как я получаю Exception in thread "main" java.util.InputMismatchException , когда просто пытаюсь получить больше пользовательского ввода.

Мои входные данные: 20 5 30 2 50 4 60 8 93 9 u 20 q

Я перепробовал все, начиная с char обычного Strings . Такое ощущение, что сканер просто не работает или что-то в этом роде.

     Exception in thread "main" java.util.NoSuchElementException
        at java.base/java.util.Scanner.throwFor(Scanner.java:937)
        at java.base/java.util.Scanner.next(Scanner.java:1594)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
        at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
        at PlayerRoster.main(PlayerRoster.java:55)
  

Комментарии:

1. в какой строке это происходит? это может быть связано с тем, что вы смешиваете вызовы nextInt() и next(). nextInt() не использует ввод

2. @Stultuske только что добавил код, забыл об этом.

3. @Stultuske chng = scnr.nextInt();

4. вы имеете в виду, что вы добавили трассировку стека (или ее часть)? вы знаете, что это не код, верно?

5. @Stultuske да, я знаю, что это не код. Я просто говорю это, потому что мне, к сожалению, пришлось сделать отступ в виде кода, чтобы опубликовать проклятую трассировку стека.

Ответ №1:

Проблема заключается в блоке кода

  if (uin == 'u')
        System.out.println("Enter a jersey number: ");
           chng = scnr.nextInt();
  

Поскольку вам нужен номер джерси только в том случае, когда пользователь вводит данные как «u», ваш chng = scnr.nextInt(); должен быть внутри блока if .
В вашем случае, даже если пользователь вводит данные как «q», он все равно ожидает большего ввода от пользователя, и, вероятно, вы просто предоставляете пустое место в этом случае, предоставляя вам исключение InputMismatchException.

Чтобы исправить это, обновите код до

 if (uin == 'u')
{
     System.out.println("Enter a jersey number: ");
     chng = scnr.nextInt();
}
  

Итак, теперь, если вы вводите данные как «q», ваш цикл прекращает выполнение, что является ожидаемым результатом.

Комментарии:

1. У меня больше нет ошибок после изменения моего кода на это. Большое спасибо! Я понятия не имел, что мне когда-либо нужно заключать в скобки операторы if.

2. Вам нужно добавить скобки к оператору if, если вы хотите, чтобы в блок if было включено более 1 оператора, в противном случае это необязательно.

3. @holdthemayo7 У вас такая же проблема в строках с System.out.println("Player " , а также. Это не вызывает исключений, оно просто всегда выводит эту строку.