Проблема считывания чисел из консоли

87
03 февраля 2022, 23:00

В программе считывается массив чисел. Должны выводиться числа, кратные 3.

    import java.util.Scanner;
    public class Main {
        public static void main(String[] args) {
            int length = getLengthOfArray();
            double [] arrayOfNumbers = getElementsOfArray(length);
            searchElementsOfArray(arrayOfNumbers);
        }
        private static int getLengthOfArray() {
            int length;
            Scanner sc = new Scanner(System.in);
            System.out.print("Please, enter a length of array: ");
            do {
                while (!sc.hasNextInt()) {
                    System.out.println("Invalid value entered. Please, try again:");
                    sc.next();
                }
                length = sc.nextInt();
                if (length <= 0) {
                    System.out.println("You must enter a positive number. Please, try again:");
                }
            } while (length <= 0);
            sc.close();
            return length;
        }
        private static double [] getElementsOfArray(int length) {
            double [] arrayOfNumbers = new double [length];
            Scanner sc = new Scanner(System.in);
            System.out.println("Please, enter an element of array: ");
            for (int i = 0; i < length; i++) {
                while (!sc.hasNextDouble()) {
                    System.out.println("Invalid value entered. Please, try again:");
                    sc.next();
                }
                arrayOfNumbers [i] = sc.nextDouble();
            }
            return arrayOfNumbers;
        }
        private static void searchElementsOfArray(double [] arrayOfNumbers) {
            for (double arrayOfNumber : arrayOfNumbers) {
                if (arrayOfNumber % 3 == 0) {
                    System.out.print(arrayOfNumber);
                }
            }
        }
    }

Результат запуска программы:

Please, enter a length of array: 3
Please, enter an element of array: 
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.nextDouble(Scanner.java:2564)
    at task3.Main.getElementsOfArray(Main.java:40)
    at task3.Main.main(Main.java:9)
Process finished with exit code 1

Почему возникает эта ошибка?

Answer 1

Проблема возникает из-за того, что ты закрываешь входной поток (на чтение), а потом пытаешься читать из него. Если не закрывать scanner, работает нормально. Проверил тут. Как понимаю, закрывая Scanner sc, ты одновременно закрываешь System.in, и из него больше нельзя считать.

Это подтверждается на сайте Oracle по Scanner:

When a Scanner is closed, it will close its input source if the source implements the Closeable interface.

Полное решение (добавил пробел между числами):

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        int length = getLengthOfArray();
        double [] arrayOfNumbers = getElementsOfArray(length);
        searchElementsOfArray(arrayOfNumbers);
    }
    private static int getLengthOfArray() {
        int length;
        Scanner sc = new Scanner(System.in);
        System.out.print("Please, enter a length of array: ");
        do {
            while (!sc.hasNextInt()) {
                System.out.println("Invalid value entered. Please, try again:");
                sc.next();
            }
            length = sc.nextInt();
            if (length <= 0) {
                System.out.println("You must enter a positive number. Please, try again:");
            }
        } while (length <= 0);
        return length;
    }
    private static double [] getElementsOfArray(int length) {
        double[] arrayOfNumbers = new double[length];
        Scanner sc = new Scanner(System.in);
        System.out.println("Please, enter an element of array: ");
        for (int i = 0; i < length; i++) {
            while (!sc.hasNextDouble()) {
                System.out.println("Invalid value entered. Please, try again:");
                sc.next();
            }
            arrayOfNumbers[i] = sc.nextDouble();
        }
        return arrayOfNumbers;
    }
    private static void searchElementsOfArray(double [] arrayOfNumbers) {
        for (double arrayOfNumber : arrayOfNumbers) {
            if (arrayOfNumber % 3 == 0) {
                System.out.print(arrayOfNumber);
                System.out.print(' ');
            }
        }
    }
}
READ ALSO
Как получить дату с calendarview?

Как получить дату с calendarview?

Как получить дату с слушателяsetOnDayChangeListener виджета CalendarView и сохранить в Postclass

217
Обновление данных на странице, без перезагрузки страницы

Обновление данных на странице, без перезагрузки страницы

Помогите пож-та Нужно в поле выбрать значение и чтоб в дрполе подставились его варианты, пример http://prntscr

85
Spring Security и аннотация доступа к контроллеру

Spring Security и аннотация доступа к контроллеру

Имеется контроллер, в котором все методы, кроме одного, доступны только администратору

128
Java: согласование thread&#39;ов

Java: согласование thread'ов

Друзья, добрый день! Взываю к помощи с многопоточностью в JavaСтоит задача реализовать простейший конвейер, на котором стоят всего два работника...

90