Исключение .NoSuchElementException при запросе у пользователя ввода

#java

#java

Вопрос:

Я не могу запустить следующий фрагмент кода. Я хотел бы знать, почему я продолжаю получать ошибку .NoSuchElementException. Я видел в другом сообщении, это связано с тем, что я использую один и тот же входной поток для обоих входов, но создание нового сканера или использование метода .close, похоже, не решает мою проблему.

 
class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner (System.in);

        int tooBig = 0; // parts too big
        int tooSmall = 0; // parts too small
        int perfectParts= 0; // perfect parts

        int a = scanner.nextInt();

        scanner.close();
        for (int i = 0; i <= a ; i  ) {
            int j = scanner.nextInt();

            if(j == 1) {
                tooBig  ;
            } else if (j == -1) {
                tooSmall  ;
            } else if (j == 0) {
                perfectParts  ;
            }
            scanner.close();
        }

        System.out.println(perfectParts   " "   tooBig
                  " "   tooSmall);



    }
}
  

Редактировать после удаления метода scanner.close(). Я все еще получаю ту же ошибку:

 import java.util.Scanner;

class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner (System.in);

        int tooBig = 0; // parts too big
        int tooSmall = 0; // parts too small
        int perfectParts= 0; // perfect parts

        int a = scanner.nextInt();


        for (int i = 0; i <= a ; i  ) {
            int j = scanner.nextInt();

            if(j == 1) {
                tooBig  ;
            } else if (j == -1) {
                tooSmall  ;
            } else if (j == 0) {
                perfectParts  ;
            }

        }


        System.out.println(perfectParts   " "   tooBig
                  " "   tooSmall);



    }
}
  

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

1. вы закрываете сканер в цикле for . это означает, что вы закрываете его несколько раз, а затем, пока он закрыт, вы запрашиваете другой ввод

2. попробуйте поместить scanner.close(); после цикла for вместо inside

3. …и вы закрываете его один раз еще до того, как войдете в цикл. Удалите все scanner.close() вызовы и посмотрите, что вы получите.

4. scanner невозможно выполнить nextInt() , если вы вызываете close() первым.

5. Я пробовал оба ваших предложения, и, похоже, ни одно из них не сработало. Я продолжаю получать ошибку.

Ответ №1:

 class Main {
public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);

    int tooBig = 0; // parts too big
    int tooSmall = 0; // parts too small
    int perfectParts= 0; // perfect parts

    int a = scanner.nextInt();

    
    for (int i = 0; i <= a ; i  ) {
        int j = scanner.nextInt();

        if(j == 1) {
            tooBig  ;
        } else if (j == -1) {
            tooSmall  ;
        } else if (j == 0) {
            perfectParts  ;
        }
        
    }

    System.out.println(perfectParts   " "   tooBig
              " "   tooSmall);

    scanner.close();

}
}
  

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

1. сканер должен быть открыт перед вызовом одного из его методов, поэтому, если вы просто закроете его в конце своего кода, он должен прекратить выдавать ошибки

2. Привет! Я все еще получаю ошибку.

3. Ошибка: исключение в потоке «main» java.util.Исключение NoSuchElementException в java.base/java.util. Scanner.throwFor(Scanner.java:937) в java.base/java.util. Scanner.next(Scanner.java:1594) в java.base/java.util. Scanner.nextInt(Scanner.java:2258) в java.base/java.util. Scanner.nextInt(Scanner.java:2212) в Main.main(Main.java:16)

4. вы удалили все остальные scanner.close(); вызовы? в самом конце должен быть только один

5. ДА. Я пробовал оба варианта, не используя scanner.close(); или используя только один. Я все еще получаю ту же ошибку.

Ответ №2:

scanner.close(); Должно вызываться только в самом конце. Это также даже не обязательно в вашем конкретном случае и, вероятно, причина, по которой вы получаете это исключение.