Исключение типа java.util.NoSuchElementException из-за nextInt () - PullRequest
0 голосов
/ 06 октября 2019

У меня есть 2 класса, а именно, MyClient и CustomerUserInterface. Класс MyClient имеет основной метод, в котором я вызываю методы CustomerUserInterface.

MyClient

    public class MyClient {
        public static void main(String args[]) {
    CustomerUserInterface customerUserInterface = new CustomerUserInterfaceImpl();
    Scanner scan = new Scanner(System.in);
    customerUserInterface.registerLoginMenu();
    int choice = scan.nextInt();
    customerUserInterface.performOperationsOnRegisterLoginMenu(choice);
        }
    }

CustomerUserInterface

public class CustomerUserInterfaceImpl implements CustomerUserInterface {

private CustomerBL customerBl;
private ProductInterface productInterface;

public CustomerUserInterfaceImpl() {
    customerBl = new CustomerBLImpl();
    productInterface = new ProductInterfaceImpl();
}

@Override
public void registerLoginMenu() {
    System.out.println("1. Register");
    System.out.println("2. Login");
    System.out.println("3. Exit");
}

@Override
public void register() {
    Customer customer = CustomerInputHelper.inputCustomer();
    boolean status=false;
    try {
        status = customerBl.registerUser(customer);
    }catch (SQLException e) {
        e.printStackTrace();
    }
    if(status) {
        System.out.println("Register Success");
        login();
    }
    else {
        System.out.println("Register Unsuccessful");
        registerLoginMenu();
    }
}

@Override
public void login() {
    Scanner scan = new Scanner(System.in);
    Boolean status=false;
    System.out.println("Enter customerID : ");      
    int id = scan.nextInt();
    System.out.println("Enter password : ");
    String pwd = scan.next();
    try {
        status = customerBl.verifyUser(id, pwd);
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    if(status) {
        productInterface.afterLoginMenu();
        System.out.println("Enter choice : ");
        int choice = scan.nextInt();
        Customer customer = null;
        try {
            customer = customerBl.getCustomer(id);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        productInterface.performOperationsOnAfterLoginMenu(choice,customer);
    }
    else {
        System.out.println("Login failed");
        registerLoginMenu();
    }
    scan.close();
}

@Override
public void performOperationsOnRegisterLoginMenu(int choice) {
    switch(choice) {
    case 1:
        register();
        break;
    case 2:
        login();
        break;
    case 3:
        System.out.println("Good Bye ! Have a Nice Day!");
        System.exit(0);
    }
}
}

Проблема, с которой я сталкиваюсь, заключается в том, что я получаю ошибку в методе login () после моей первой строки System.out, т.е.

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)

Регистр вызывает метод login после успешной регистрации, но простопосле вызова метода входа в систему я получаю вышеуказанную ошибку.

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

Ответы [ 3 ]

0 голосов
/ 06 октября 2019

Документация класса Scanner сообщает, что NoSuchElementException выбрасывается, если входной поток исчерпан. Поэтому я предполагаю, что входной поток по какой-то причине закрыт.

Как вы запускаете свой код? Через IDE или просто с помощью java MyClient вызова в командной строке? Возможно, здесь кроется ваша ошибка.

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

public class MyClient {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println(sc.nextInt());
    }
}
0 голосов
/ 06 октября 2019

Вы регистрируете сканер в system.in дважды, один раз в MyClient:

public class MyClient {
   public static void main(String args[]) {
     Scanner scan = new Scanner(System.in);

и один раз в методе входа в систему CustomerUserInterface:

@Override
public void login() {
   Scanner scan = new Scanner(System.in);

, который не будет работать, как первыйСканер уже имел поток System.in.

Вам необходимо использовать один и тот же экземпляр сканера в вашей программе.

0 голосов
/ 06 октября 2019

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

То есть: убедитесь, что «choice» не содержит никакого бессмысленного значения.

Это должно помочь.

...