Сканер не запрашивает ввод, выдает исключение «Нет такого элемента» - несколько сканеров - PullRequest
0 голосов
/ 03 октября 2018

В приведенном ниже коде я использовал два сканера: один в метод executeAction () и один в методе getTicketNumber ().Я использовал try с ресурсами, и однажды, когда я вхожу в метод getTicketNumber (), он работает нормально, и однажды, когда элемент управления возвращается и возвращается к executeAction (), я получаю No No Element Exception, когда он выполняет строку scanner.nextInt (),Я хотел продолжить этот процесс, пока я не нажму выход.Я предполагаю, что это связано с использованием нескольких сканеров, так как, если я не вхожу в метод getTicketNumber (), он работает нормально.Есть идеи?

private void performAction() {
    int choice = 4;
    System.out.println("Hi User");
    System.out.println("What do you want to do ");
    try (Scanner scanner = new Scanner(System.in)) {
        do {
            System.out.println("1. Book ticket");
            System.out.println("2. Cancel ticket");
            System.out.println("3. Check status");
            System.out.println("4. Exit");
            System.out.println("Enter your choice");
            choice = scanner.nextInt();
            System.out.println();
            doActionBasedOnChoice(choice);
            System.out.println();
        } while (choice != 4);

    } catch (InputMismatchException e) {
        System.out.println("Please enter a valid choice");
    }
}

private void doActionBasedOnChoice(int choice) {

    switch (choice) {
    case 1:
        ticketReservation.bookFlight();
        break;
    case 2:
        System.out.println("Please enter your ticket number ");
        int ticketNumber = getTicketNumber();
        ticketReservation.cancel(ticketNumber);
        break;
    case 3:
        ticketReservation.checkConfirmedListStatus();
        break;
    case 4:
        System.out.println("Thank you ");
        break;
    default:
        break;
    }
}

private int getTicketNumber() {
    try (Scanner scanner = new Scanner(System.in)) {
        int choice = scanner.nextInt();
        return choice;
    } catch (InputMismatchException e) {
        System.out.println("Please enter a valid ticekt number");
    }
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Когда «внутренний» сканер выходит из области видимости, он удаляется блоком try, который, в свою очередь, закрывает поток System.in.или, в качестве альтернативы, переместите его в более высокую область.

0 голосов
/ 03 октября 2018

Я понял, что когда вы используете try с ресурсом, он автоматически закрывает ресурс, и после закрытия System.in его невозможно открыть.
Поэтому советуем использовать один объект сканера и передать его через аргументы вразные методы

...