Помогите пожалуйста с Java-программой

Рейтинг: -2Ответов: 1Опубликовано: 26.05.2023

Помогите пожалуйста с программой(( Дали на учёбе задание:

Напишите программу, которая считывает строки, вводимые пользователем, ввод закончить, если введена строка "quit". Данные вводить с помощью класса Scanner, для исключения неправильного ввода, использовать механизм обработки исключений try/catch

Исключением же является:

public String nextLine() Advances this scanner past the current line and returns the input that was skipped. This method returns the rest of the current line, excluding any line separator at the end. The position is set to the beginning of the next line. Since this method continues to search through the input looking for a line separator, it may buffer all of the input searching for the line to skip if no line separators are present.

Returns: the line that was skipped Throws: NoSuchElementException - if no line was found

import java.util.Scanner;
import java.util.NoSuchElementException;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        try {
            while (true) {
                System.out.println("Введите строку (quit для завершения):");
                String input = null;
                try {
                    input = scanner.nextLine();
                } catch (NoSuchElementException e) {
                    System.out.println("Ошибка ввода: " + e.getMessage());
                    break;
                }
                if (input.equals("quit")) {
                    break;
                }
            }
        } catch (Exception e) {
            System.out.println("Ошибка ввода: " + e.getMessage());
        } finally {
            scanner.close();
        }
    }
}

По сути исключение должно работать если в поле ввода нажать Ctrl+D, ввести пустую строку или закрыть консоль. Так вот, вопрос в том, как ввести пустую строку? При нажатии на enter во время работы программы не вылезает сообщение "Ошибка ввода:"

Ответы

▲ 0

В случае ввода пустой строки исключение выбрасываться НЕ должно, ведь сканер обработает такую ситувцию корректно, как описано в документации, приведённой в вопросе:

Advances this scanner past the current line and returns the input that was skipped. This method returns the rest of the current line, excluding any line separator at the end.

Исключение "работает", то есть выбрасывается в случае, если будет нажата комбинация Ctrl + D, когда ввод остаётся пустой.

В данном случае после ввода строки ctrl+d первое нажатие Ctrl + D сбросило буфер консоли в поток ввода JVM и очистило этот буфер, и при повторном нажатии комбинации поток ввода был закрыт, что и привело к исключению при чтении из сканера.

Онлайн демо на GDB

введите сюда описание изображения

Аналогично, в примере ниже после ввода каждого "слова" использовалась упомянутая комбинация, но ввод продолжался до нажатия Enter, после которого он был очищен, и следующее нажатие Ctrl + D так же закрыло поток ввода, что и привело к исключению.

введите сюда описание изображения

Разумеется, если дважды нажать Ctrl + D после ввода команды quit, исключение НЕ будет выброшено, так как выход из цикла по этому условию произойдёт раньше, чем выполнится повторная попытка чтения сканера / потока ввода.

введите сюда описание изображения