JAVA: een menulus maken

Mijn programma bevat een aantal opties die de gebruiker kan selecteren door een nummer in te voeren waarmee hij een specifieke taak kan voltooien. Momenteel is mijn code ingesteld met if en else if-lussen om de taak te voltooien als een bepaald aantal invoer. Echter, op het moment dat het programma stopt na één taak. Ik wil dat de gebruiker een ander nummer kan invoeren om een andere taak te voltooien. Ik heb geprobeerd de code te omringen met een while-lus en een exit-optie om de gebruiker toe te staan aan de lus te ontsnappen en het programma te beëindigen, maar dit werkt niet en resulteert in een “java.util.NoSuchElementException”. Het programma werkt prima zonder de while-lus.

Dit is een voorbeeld van de huidige code die hopelijk duidelijk maakt wat ik bedoel:

System.out.println("Enter one of the following commands:");
System.out.println("1 - something..");
System.out.println("2 - something else..");
System.out.println("3 - exit");
Scanner scanchoice = new Scanner(System.in);
System.out.println();
System.out.println("Enter \"1\", \"2\" or \"3\"");
int choiceentry = scanchoice.nextInt();
while (choiceentry != 3) {
    if (choiceentry < 1 || choiceentry > 3) {
        System.out.println("Enter \"1\", \"2\", \"3\" or \"4\"");
        choiceentry = scanchoice.nextInt();
    }
    else if(choiceentry == 1) {
        // ..do something
    }
    else if(choiceentry == 2) {
        //..something else
    }
    else if(choiceentry == 3) {
        //...exit program
    }
}   

Dus ik wil in deze lus komen en alleen afsluiten om het programma te beëindigen. Ik hoop dat de while-lus de gebruiker terugbrengt naar een menu, zodat je een andere optie kunt selecteren, maar dit werkt niet. Wat is er mis met deze code? En hoe kan ik dit idee implementeren?

Bij voorbaat dank!


Antwoord 1, autoriteit 100%

Gebruik Scanner#hasNextInt()voordat u Scanner.nextInt()aanroept om de NoSuchElementException

te verwijderen

if(scanchoice.hasNextInt())
choiceentry = scanchoice.nextInt();

hasNextInt()retourneert alleen true als het volgende token een geldige int is

Je kunt het zo doen

   //set choiceentry to -1, this will make it to enter while loop
     int choiceentry = -1
    while(choiceentry < 1 || choiceentry > 3){
            System.out.println("Enter \"1\", \"2\", \"3\" or \"4\"");
            if(scanchoice.hasNextInt())
            choiceentry = scanchoice.nextInt();
    }
     switch(choiceentry){
        case 1:
           //do logic
           break;
        case 2:
           //do logic
           break;
        case 3:
           //do logic
           break;
   }

Ik heb het gewijzigd om switch-statements te gebruiken, omdat ze handig zijn bij het verkrijgen van invoergegevens


Antwoord 2, autoriteit 75%

U vraagt de gebruiker alleen om een ander menu-item te kiezen als de keuze < 1of > 3

je moet deze code instellen in een elsestatement`:

while (choiceentry != 3) {
    else if(choiceentry == 1) {
        // ..do something
    }
    else if(choiceentry == 2) {
        //..something else
    }
    else if(choiceentry == 3) {
        //...exit program
    }
    else{
        System.out.println("Enter \"1\", \"2\", \"3\" or \"4\"");
        choiceentry = scanchoice.nextInt();
    }
}   

Antwoord 3, autoriteit 25%

Als u wilt dat uw programma de gebruiker door te voeren om een ​​taak te selecteren, moet u die prompt verplaatsen, evenals uw nextInt()Oplossing naar ergens in uw lus, maar verklaring zodat deze altijd op elke iteratie wordt aangeroepen.

Zoals de heer Phi heeft voorgesteld in de opmerkingen, zou een schakelinstantie een beter alternatief zijn voor uw huidige IF-else-structuur. Het maakt uw code-reiniger om te lezen en een standaardcase is best goed voor het vangen van onverwachte waarden.

Ik zou ook toevoegen dat een do-while geschikt is voor deze taak. Op deze manier hoeft u uw prompt niet twee keer te coderen.

int choiceentry;
do {
    System.out.println("Enter \"1\", \"2\" or \"3\"");
    choiceentry = scanchoice.nextInt();
    switch (choiceentry)
    {
        case 1:
            // do something
            break;
        case 2: 
            // ..something else
            break;
        case 3: 
            // .. exit program
            break;
        default:
            System.out.println("Choice must be a value between 1 and 3.");
    }   
} while (choiceentry != 3);

Other episodes