首页 > 解决方案 > 由于 nextInt() 导致的 java.util.NoSuchElementException 类型的异常

问题描述

我有 2 个类,即 MyClient 和 CustomerUserInterface。MyClient 类有一个 main 方法,我在其中调用 CustomerUserInterface 的方法。

我的客户

    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);
        }
    }

客户用户界面

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);
    }
}
}

我面临的问题是在我的第一条 System.out 行之后我在 login() 方法中出现错误,即

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)

注册成功后,注册器调用登录方法,但在登录方法调用之后,我得到了上述错误。

我不明白用户注册时的问题,但在调用登录方法后立即显示错误。

标签: javaeclipsejava.util.scanner

解决方案


您在 system.in 上注册 Scanner 两次,一次在 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 流。

您需要在整个程序中使用相同的扫描仪实例。


推荐阅读