2017-12-11 10 views
0

Hey, das ist ein kleiner Teil meines Programms, mit dem ich große Probleme habe. Ich möchte, dass das Programm dem Benutzer eine Fehlermeldung gibt und die Schleife von Anfang an startet, wenn die Eingabe keine Ganzzahl ist, während ich möchte, dass es in den Schalter/Fall weitergeht, wenn es eine ganze Zahl ist. Das ist, was ich bis jetzt bekommen habe, aber es funktioniert nicht, da ich die inputmismatchexception erhalte, wenn es falsch ist und es nicht in den Schalter/Fall weitergeht, wenn es richtig ist?Geben Sie eine Fehlermeldung und starten Sie die Schleife neu, wenn Benutzereingabe nicht den richtigen Datentyp in Java ist, während fortfahren, wenn es ist?

public static void main(String[] args) { 
    ArrayList<Dog> doglist = new ArrayList<Dog>(); 
    Scanner myscan = new Scanner(System.in); 
    boolean running = true; 

    while (running) { 
     System.out.println("\n************************************"); 
     System.out.println("\nWelcome to the kennel club!"); 
     System.out.println("\n************************************"); 
     System.out.println("\n[1] Register new dog"); 
     System.out.println("[2] Print out list"); 
     System.out.println("[3] Increase age"); 
     System.out.println("[4] Remove dog"); 
     System.out.println("[5] Quit program"); 
     System.out.println("\n************************************"); 
     System.out.println("\nChoose: "); 

     int option = 0; 
     boolean inputOk = false; 
     do { 
      try { 
       option = myscan.nextInt(); 
       inputOk = true; 
      } catch (InputMismatchException e) { 
       System.out.println("Option must be a number"); 
       myscan.nextLine(); // to consume the \n that remains at the end of the line after using nextInt(); 
      } 
     } 
     while (!inputOk); 

     switch (option) { 
      case 1: 
       System.out.println("Write name:"); 
       String name = myscan.next(); 
       System.out.println("Write race:"); 
       String race = myscan.next(); 
       System.out.println("Age:"); 
       int age = myscan.nextInt(); 
       System.out.println("Weight:"); 
       double weight = myscan.nextDouble(); 

       Dog dog = new Dog(name, race, age, weight); 

       doglist.add(dog); 

       break; 

      case 2: 

       System.out.println("Minimum length of tail:"); 
       double userInput1 = myscan.nextDouble(); 

       for (Dog d : doglist) { 
        if (d.getTailLength() >= userInput1) { 
         System.out.println(d.toString()); 
        } 
       } 

       break; 

      case 3: 

       System.out.println("Name of dog:"); 
       String userInput2 = myscan.next(); 
       int flag = 0; 
       for (Dog d : doglist) { 
        if (d.getName().equals(userInput2)) { 
         d.increaseAge(); 
         d.increasetailLength(); 
         flag = 1; 
         break; 
        } 
       } 

       if (flag == 0) { 
        System.out.println("Error, can't find dog with name:" + userInput2); 
       } 

       break; 

      case 4: 

       System.out.println("Name of dog:"); 
       String userInput3 = myscan.next(); 

       Dog dogToRemove = null; 

       for (Dog d : doglist) { 
        if (d.getName().equals(userInput3)) { 
         dogToRemove = d; 
         System.out.println("Dog is removed"); 
        } 
       } 

       if (dogToRemove == null) { 
        System.out.println("Error, can't find dog with name: " + userInput3); 
       } else { 
        doglist.remove(dogToRemove); 
       } 

       break; 

      case 5: 

       running = false;//Avslutar loopen och därmed programmet 
       System.out.println("Program finshed"); 
       break; 

      default: 

       System.out.println("Error, choose between [1] [2] [3] [4] [5]");//Felmeddelande om valet är någon annan siffra än de som menyn innehåller 
       break; 
     } 
    } 
} 

Antwort

1

Sie können eine do-while fügen Sie die Option fangen die InputMismatchException zu lesen:

int option = 0; 
boolean inputOk = false; 
do{ 
    try { 
     option = myscan.nextInt(); 
     inputOk = true; 
    } catch (InputMismatchException e) { 
     System.out.println("Error, this is not an integer."); 
     myscan.nextLine(); // to consume the \n that remains at the end of the line after using nextInt(); 
    } 
}while (!inputOk); 

Auf diese Weise wird es Schleife, bis Sie eine gültige Nummer.

EDIT

Wenn Sie wieder das Menü drucken möchten, dann können Sie dies tun: in Ihrem ursprünglichen Code, ändern Sie die break-Anweisung mit einer Aussage fortsetzen und auch einen Aufruf an die nextLine Methode to consume the remaining \n:

int option = 0; // don't read the value directly before validating that is actually an integer value or you will get the InputMismatchException 

if (!myscan.hasNextInt()) { 
    System.out.println("Error, this is not an integer:"); 
    myscan.nextLine(); // consume the \n 
    continue; // loop again 
} else { 
    option = myscan.nextInt(); 
} 
+0

Ich habe dies hinzugefügt, aber das gleiche passiert immer noch. Es wird nicht mit der switch-Anweisung fortgesetzt, wenn es korrekt ist, und stürzt ab, wenn es nicht – mackanmorre

+0

ist. Haben Sie die if-Anweisung nach dem Versuch, diesen Vorschlag auszuprobieren, entfernt? –

+0

ja, das funktioniert so lange wie es richtig ist, aber es kehrt nicht in die Schleife nach der Fehlermeldung zurück? – mackanmorre

2

Statt greifen und erwartet eine ganze Zahl, wenn Sie nicht eine garantiert sind, einfach greifen, was auch immer die nächste Zeile und festzustellen, ob der Wert eine ganze Zahl mit einem regulären Ausdruck wie diese

eingetragen ist
 while(running) 
     { 
      inputFromUser = myscan.nextLine(); 
      int option = -1; //some default invalid value 
      boolean doSwitch = false; 

      if(inputFromUser.matches("\\d+")) 
      { 
       option = Integer.parseInt(inputFromUser); 
       doSwitch = true; 
      } 
      else{ 
       System.out.println("Incorrect input was received - " + inputFromUser); 
      } 

      if(doSwitch) 
      { 
       //switch logic 
      } 
     } 
+0

Die Option in der switch-Anweisung funktioniert nicht so, da sie in einer if-Anweisung initialisiert wird? – mackanmorre

+0

das vorherige hätte funktioniert, aber wenn Sie am Anfang initialisieren möchten, fragen Sie nach Eingabe und dann versuchen Sie den Schalter, den Sie können. Das wird auch gut mit den Änderungen @mackanmorre funktionieren –

Verwandte Themen