2017-09-26 2 views
0

Ich mache ein kleines Programm, wo der Benutzer wählt, welche Option möchte. Ich benutze switch, und alles funktioniert gut, aber jetzt versuche ich die Sprachauswahl zu verbessern, ich versuche dies mit Arrays zu erreichen (ich weiß nicht, wie ich es richtig erklären soll, aber es ist einfach zu siehe im Code).Code wird ohne falschen Grund ausgeführt

//Each menu option 
static String[][] menuOptions = 
{ 
    { 
     "1. Check your grades", 
     "2. Check if you can examine for a driving license", 
     "3. Check if a number is odd or even", 
     "4. Check if a number is divisible by 7", 
     "5. Check if a triangle is equilater", 
     "6. Check who won", 
     "7. Check which number is bigger", 
     "8. Check if you can have a \"Carnet Jove\"", 
     "9. Convert numeric grades to letters", 
     "10. Exit Application" 
    }, 
    { 
     "1. Comprobar si has aprobado", 
     "2. Check if you can examine for a driving license", 
     "3. Check if a number is odd or even", 
     "4. Check if a number is divisible by 7", 
     "5. Check if a triangle is equilater", 
     "6. Check who won", 
     "7. Check which number is bigger", 
     "8. Check if you can have a \"Carnet Jove\"", 
     "9. Convert numeric grades to letters", 
     "10. Exit Application" 
    } 
}; 
//End of Options 

static Scanner Scan = new Scanner(System.in); 

static boolean correctInput = false; 
static int language; 
static int selection; 

public static void main(String[] args) 
{ 
    System.out.println("\t1. English\t2. Español\n"); 
    System.out.print("Select a Language:\tSeleccione un Idioma:\t"); 
    language = Scan.nextInt(); 
    System.out.print(""); 
    while (correctInput != true) 
    { 
     menu(language); 
     try //Comprobamos que el usuario haya introducido un numero 
     { 
      selection = Integer.parseInt(Scan.nextLine()); 
     } catch (NumberFormatException ex) //En caso de error lo gestionamos 
     { 
      //No hacemos nada 
     } 

     switch (selection) 
     { 
      case 1: 
       correctInput = true; 
       checkGrades(); 
       break; 
      case 2: 
       correctInput = true; 
       chechDrivingLicense(); 
       break; 
      case 3: 
       correctInput = true; 
       checkOddNum(); 
       break; 
      case 4: 
       correctInput = true; 
       checkDivBy7(); 
       break; 
      case 5: 
       correctInput = true; 
       checkEquilater(); 
       break; 
      case 6: 
       correctInput = true; 
       checkWinner(); 
       break; 
      case 7: 
       correctInput = true; 
       checkBigger(); 
       break; 
      case 8: 
       correctInput = true; 
       checkCarnetJove(); 
       break; 
      case 9: 
       correctInput = true; 
       convertNumGradeToLetter(); 
       break; 
      case 10: 
       correctInput = true; 
       break; 
      default: 
       System.out.println("\n\n\n\nInput not valid. Please enter" 
         + " a valid number\n"); 
     } 
    } 

} 

private static void menu(int language) 
{ 
    System.out.println("\n"); 
    int sel = 12; 
    for (String s : menuOptions[language - 1]) 
    { 
     System.out.println("\t" + s); 
    } 
    System.out.print("\nSelect an option: \t"); 

} 

Statt das gewählte Menü anzuzeigen (das jetzt nur eine Option hat übersetzt, aber es ist genug, um zu überprüfen, ob es funktioniert oder nicht), was passiert ist, dass, wenn das Menü angezeigt wird, wählt es automatisch eine Option (was immer ein ungültiger ist) und löst die Wiederholung des Menüs 1 mal aus. Es ist kein großes Ärgernis, aber ich möchte es beheben.

Hier ist ein, was die aktuelle Ausgabe wie folgt aussieht: enter image description here

+4

besten ... titel ... immer ... normalerweise wird es ausgeführt, weil Sie es ausführen :) versucht, einen anderen Wert im catch-Block zu setzen? – Stultuske

+0

@Stultuske Ja, ich habe versucht, einen Wert für _selection_ im catch-Block zu setzen. Es hat die Ausgabe nicht geändert. –

Antwort

3
language = Scan.nextInt(); 

Dies bedeutet eine ganze Zahl liest, aber nicht die folgenden Newline.

selection = Integer.parseInt(Scan.nextLine()); 

Wenn dies das erste Mal erreicht wird, wartet ein Newline darauf, gelesen zu werden. nextLine() gibt sofort eine leere Zeichenfolge zurück.

catch (NumberFormatException ex) //En caso de error lo gestionamos 
{ 
    //No hacemos nada 
} 

Sie könnten dies sehen, wenn Sie die resultierende Ausnahme nicht geschluckt haben. Behandeln Sie keine Ausnahmen, indem Sie nichts tun! Rufen Sie mindestens ex.printStackTrace() auf, um die Fehlermeldung anzuzeigen. Besser noch, bitten Sie den Benutzer, es erneut zu versuchen.

Um Ihr Programm zu reparieren, vermeiden Sie Mischen nextInt() und nextLine(). Es ist besser, immer nextLine() zu verwenden. Lesen Sie language genauso wie Sie selection tun und Sie werden besser dran sein.

language = Integer.parseInt(Scan.nextLine()); 
Verwandte Themen