2016-04-25 4 views
0

Ich bin neu in Java, und ich arbeite an einer Methode in meinem Programm, die überprüft, die Benutzereingabe in Grenzen zu sein, nicht ein Nullwert (Null), kein Buchstabe und eine positive Zahl. Also habe ich ursprünglich zwei while-Schleifen in diese Methode eingebaut, um die Gültigkeit dieser Eingaben zu überprüfen, aber ich würde es gerne in einer Schleife vereinfachen. Ich bekomme einen Fehler, wenn ich einen Buchstaben (zB a) nach ein paar Eingaben eintrage, und ich glaube, dass es aufgrund der zwei verschiedenen while-Schleifen komplizierter ist. Kann mir bitte jemand dabei helfen?Wie vereinfache ich diese Integer-Validierung?

public static void valid(String s, int max) 
{ 
    while(sc.hasNextInt() == false) { 
     System.out.println("That is not correct. Try again:"); 
     sc.nextLine(); 

    } 

    int value; 
    while((value= sc.nextInt()) > max || (value= sc.nextInt()) <= 0){ 
     System.out.println("That is not correct. Try again: "); 
     sc.nextLine(); 
    } 
    sc.nextLine(); 
    return; 

} 
+0

Welcher Fehler? Erhalten Sie * "Das ist nicht korrekt. Versuchen Sie es erneut:" * oder eine Ausnahme? – Gendarme

+0

Wenn Sie 'nextInt' verwenden, können Sie niemals einen Brief einlesen. –

+0

müssen Sie auch '==' in Ihrer zweiten while-Schleife verwenden. (Wert = sc.nextInt()) ist nicht dasselbe wie (Wert == sc.nextInt()). –

Antwort

1

Sie haben:

int value; 
    while((value= sc.nextInt()) > max || (value= sc.nextInt()) <= 0){ 
     System.out.println("That is not correct. Try again: "); 
     sc.nextLine(); 
    } 

Welche sc.nextInt() zweimal tut, so value nicht unbedingt den gleichen Wert in diesen beiden Fällen haben, und es wird auch zweimal Sie für eine Reihe zu stellen.

Ein Update wäre so etwas wie dieses:

int value; 
    while((value = sc.nextInt()) > max || value <= 0) { 
     System.out.println("That is not correct. Try again: "); 
     sc.nextLine(); 
    } 

, die es besser machen würde, aber immer noch Probleme haben. Wenn value größer als max ist, wird die Schleife erneut durchlaufen und ruft nextInt() auf, aber dieses Mal haben Sie nicht überprüft für hasNextInt(). Deshalb solltest du alles in einer Schleife haben. Etwas wie folgt aus:

public static void valid(String s, int max) { 
    while(true) { 
     if(!sc.hasNextInt()) { //this is the same as sc.hasNextInt() == false 
      System.out.println("That is not correct. Try again:"); 
      sc.nextLine(); 
      continue; //restart the loop again 
     } else { 
      int value = sc.nextInt(); 
      if(value > max || value <= 0) { 
       System.out.println("That is not correct. Try again:"); 
       sc.nextLine(); 
       continue; //restart the loop from the top - important! 
      } else { 
       extendedValidation(value, s); 
       return; 
      } 
     } 
    } 
} 
+0

Danke viel! das schien den Trick zu machen –

1

Versuchen Sie, etwas mehr wie (Pseudocode):

while valid input not yet received: 
    if input is an integer: 
     get integer 
     if in range: 
      set valid input received 
    skip rest of line 

extended validation 

Mit einem wenig Gedanken, sollten Sie die Verwendung eines „Druckfehlermeldung“ Anweisung sein. Aber mit zwei könnte besser sein; es kann dem Benutzer sagen, was sie falsch gemacht haben.

0

Was ist der Zweck des String s Parameter? Sollten Sie dies anstelle eines Scanner-Eingangs überprüfen?

Auch nicht durch Mischen nextInt() und nextLine() überrascht sein. - Source

Ich bevorzuge Do-While-Schleifen für die Eingabe vor der Validierung.

public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    int max = 1000; 
    int val = -1; 
    String in; 

    do { 
     // Read a string 
     System.out.print("Enter a number: "); 
     in = input.nextLine(); 

     // check for a number 
     try { 
      val = Integer.parseInt(in); 
     } catch (NumberFormatException ex) { 
      // ex.printStackTrace(); 
      System.out.println("That is not correct. Try again."); 
      continue; 
     } 

     // check your bounds 
     if (val <= 0 || val > max) { 
      System.out.println("That is not correct. Try again."); 
      continue; 
     } else { 
      break; // exit loop when valid input 
     } 

    } while (true); 

    System.out.println("You entered " + val); 
    // extendedValidation(value, in); 
} 
0

Ich würde sagen, dass dies zu viel näher ist, was Sie suchen, in einfachen Worten ...

import java.util.Scanner; 

public class Test { 
    public static void main(String[] args) { 
     final int MIN = 0; 
     final int MAX = 10; 
     Scanner sc = new Scanner(System.in); 
     int value = -1; 
     boolean valid; 

     do { 
      valid = sc.hasNextInt(); 
      if (valid) { 
       value = sc.nextInt(); 
       valid = value > MIN && value < MAX; 
      } 

      if (!valid) { 
       System.out.println("Invalid!"); 
       sc.nextLine(); 
      } 
     } while (!valid); 

     System.out.println("Valid Value: " + value); 
    } 
} 

Sie sollten diesen Code zu abstrahieren der Lage sein, Ihren Anforderungen zu entsprechen.