0
votes

Exception de type java.util.NoSuchElementException due à nextInt ()

J'ai 2 classes à savoir, MyClient et CustomerUserInterface. La classe MyClient a une méthode principale dans laquelle j'appelle des méthodes de CustomerUserInterface.

MyClient

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)

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

Le problème auquel je suis confronté est que j'obtiens une erreur dans la méthode login () après ma première ligne System.out, c'est-à-dire

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


0 commentaires

3 Réponses :


0
votes

Essayez de ralentir votre programme pour accepter l'entrée avant d'utiliser la variable d'entrée pour dans un appel de fonction.

Autrement dit: vérifiez que le "choix" ne contient aucune valeur absurde.

Cela devrait aider.


0 commentaires

0
votes

Le la documentation de la classe Scanner vous indique que l'exception NoSuchElementException est lancée si le flux d'entrée est épuisé. Par conséquent, je suppose que le flux d'entrée est fermé pour une raison quelconque.

Comment exécutez-vous votre code? Via un IDE ou simplement avec un appel java MyClient sur la ligne de commande? Peut-être que c'est là que réside votre erreur.

Si vous exécutez le code suivant, il devrait répéter votre entrée. Si cela ne fonctionne pas, vous appelez votre code de manière incorrecte.

public class MyClient {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println(sc.nextInt());
    }
}


0 commentaires

0
votes

Vous enregistrez Scanner sur system.in deux fois, une fois dans MyClient:

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

et une fois dans la méthode de connexion CustomerUserInterface:

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

cela ne fonctionnera pas, car le premier scanner avait déjà le flux System.in.

Vous devez utiliser la même instance de scanner dans tout votre programme.


0 commentaires