繁体   English   中英

扫描仪不要求输入,抛出 No such Element Exception - 多个扫描仪

[英]Scanner not asking for input , throws No Such Element Exception - multiple scanners

在下面的代码中,我使用了两个扫描器,一个在 performAction() 方法中,一个在 getTicketNumber() 方法中。 我使用过资源尝试,有一次当我进入 getTicketNumber() 方法时,它工作正常,一次当控件返回并进入 performAction() 时,当它执行扫描器.nextInt() 行时,我得到 No such Element Exception . 我想继续这个过程,直到我按退出。 我想这是由于使用了多个扫描仪,因为如果我不进入 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;
}

当“内部”扫描器超出范围时,它由 try 块处理,然后关闭 System.in 流。

通过将扫描仪传递给需要它的任何人来解决,或者将其移至更高的范围。

我发现当你使用 try with resource 时,它​​会自动关闭资源,一旦System.in关闭,它就无法重新打开。
所以建议是使用一个扫描仪对象并通过 args 将其传递给不同的方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM