2017-03-20 4 views
-3

ich einen Try-Catch, die gemeint ist, etwas zu fangen, die nicht eine ganze Zahl ist. Wenn ich eine nicht ganzzahlige Zahl (z. B. 5,6) eintrage, sagt es mir, dass nur ganze Zahlen erlaubt sind und ich es erneut versuchen kann (wie es sollte). Aber wenn ich wieder eine Nicht-Ganzzahl eingabe, sagt es nichts und nimmt weiterhin Eingaben, die Ausgabe bleibt leer.Try-catch nur Schleifen einmal

if (choicesObjects == b) { 
    System.out.println("TEST 2");    
    System.out.println("Object: Right triangle"); 
    System.out.println("\nEnter length of Right triangle: "); 

    int lengthOfTriangle = 0; 
    try {     
     lengthOfTriangle = input.nextInt();   
    } catch(InputMismatchException e) {   
     System.out.println("\nError: user input must be an integer greater than 0.\n"); 
     System.out.println("Object: Right triangle"); 
     System.out.println("\nEnter length of Right triangle: "); 
     input.next();     
    } 
    //method stuff 
} 
+5

try/catch ist keine Schleife. Sie müssten eine Schleife verwenden, wenn Sie eine Schleife wünschen. –

+0

Und Ihre Frage ... –

+0

Sie müssen so etwas tun: while (Bedingung nicht erfüllt) {Benutzereingaben erhalten} – ndlu

Antwort

4

Die try/catch Anweisung ist keine Schleife. Es wird immer einmal ausgeführt.

Natürlich, wenn es eine Schleife im Inneren des try Block ist, wird dieser Block halten, bis sie beendet die Ausführung. Aber eine solche Schleife erfordert eine explizite Befehl wie while oder for verwendet werden.

Scheinbar, was passiert, wenn Sie einen nicht ganzzahligen Wert (z. B. 5,6) eingeben, ist, dass die nextInt()-Anweisung eine Ausnahme auslöst und an den catch-Block geht. Eine bessere Erklärung kann gegeben werden, wenn der vollständige Code der Methode bereitgestellt wird.

3

Dazu Sie eine Funktion definieren können, wie etwas, das sollte funktionieren

private int getNextInt(Scanner input) { 
    boolean isInt = false; 
    int userInput; 
    while(!isInt) { 
     try { 
      userInput = Integer.valueOf(input.next()); 
      isInt = true; 
     } catch(NumberFormatException e) { 
      // Do nothing with the exception 
     } 
    } 
    return userInput; 
} 

Dies sollte laufen, bis eine gegebene Eingabe ein int war und dann die Rückkehr int

+1

Sie müssen auch das ungültige Token in der Catch konsumieren, sonst steckt es in einer Endlosschleife fest. Siehe [hier] (http://stackoverflow.com/questions/3572160/how-to-handle-infinite-loop-caused-by-invalid-input-using-scanner) –

+0

@shashwat guter Punkt, Festsetzung, dass – Mikenno

+0

@Mikenno Du wurdest entschädigt ... und ehrlich gesagt: Das Löschen von nicht so guten Antworten ist eine großartige Übung. p1 nur dafür! – GhostCat

1

Sie Ihren Code, um etwas aktualisieren dies wie -

Scanner in = new Scanner(System.in); 
    int num = 0; 
    while(true) { 
     try{ 
      num = in.nextInt(); 
      break; 
     }catch(Exception e){ 
      //print statements 
      System.out.println("Try again"); 
     } 
    } 
    System.out.println("Done"); 
+0

hast du das getestet?Weil das bei mir nicht klappt [hier] (https://ideone.com/hHktSE). Steht einfach in einer Endlosschleife fest und druckt erneut. –

+0

Ja, @Shashwat. Ich habe die Ausführung des obigen Codes bestätigt. –

+0

Überprüfen Sie den Link, den ich gerade gab –

1

so etwas wie dieses

Boolescher Check = Wahr;

while (check) { wenn choicesObjects == b {

Code eingeben hier` System.out.printin ("Test 2"); System.out.println ("Objekt: rechtes Dreieck"); System.out.println ("\ nEingeben der Länge des rechten Dreiecks:");

  int lengthOfTriangle = 0; 

      try { 

      lengthOfTriangle = input.nextInt(); 


      } catch(InputMismatchException e) { 

       System.out.println("\nError: user input must be an integer greater than 0.\n"); 
       check = false; 

System.out.println ("Object: Right Dreieck"); System.out.println ("\ nGeben Länge des rechten Dreiecks:"); input.next();

  } 
       //method stuff 
      } 
     } 

`

+0

müssen Sie auch das ungültige Token im Fang verbrauchen. Überprüfen Sie [hier] (http://stackoverflow.com/questions/3572160/how-to-handle-infinite-loopcracted-by-invalid-input-using-scanner) –

+0

Bitte nehmen Sie sich etwas Zeit in die Formatierung Ihrer Antwort. Das ist ein Chaos. –

+0

userInput = Ganzzahl.parseInt (input.next()); – demopix