5

Ich versuche, ein wenig Code auszuführen, der nach einem Benutzereingabewert sucht. Diese Aktion ist in einer benutzerdefinierten Methode namens getTriangleDim() enthalten. Die Methode liest den int-Wert des Benutzers ein, stellt sicher, dass sie innerhalb eines bestimmten Bereichs liegt, und gibt dann den eingegebenen int-Wert zurück. Die Methode funktioniert großartig und ich habe keine Probleme damit.Java: Try-Catch-Anweisung in einer Do-While-Schleife

Das Problem tritt auf, wenn ich einen Nicht-Int-Wert für meine getTriangleDim() -Methode eingeben. Es gibt mir einen InputMismatchException-Fehler. Ich habe eine try-catch-Anweisung in eine Do-while-Schleife geschrieben, um dieses Problem zu beheben. Aber das ist das erste Mal, dass ich eine Try-Catch-Anweisung verwendet habe und mir anscheinend etwas fehlt. Hier

ist der Code für die try-catch-Anweisung innerhalb der do-while-Schleife verschachtelt:

//loop to scan for triangle dimension 
     boolean bError = true; 
     int triangle; 

     do{ 
      try { 
       triangle = getTriangleDim(); 
       bError=false; 
       } 
      catch (Exception e){ 
       System.out.println("You did not enter an integer, please enter an integer value"); 
       triangle = getTriangleDim(); 

       } 
     }while (bError); 

wenn ich es testen, indem Sie einen char-Wert anstelle des int eintritt, es fängt tatsächlich den Fehler einmal , und druckt dann meine "Sie hat nicht ....." Aussage. Aber wenn ich wieder eine andere Nicht-Int-Nummer eintrage, bekomme ich wieder einen Laufzeitfehler, der sagt ....... Du hast es erraten ........ InputMismatchException error.

Der Code für meine Methode ist hier:

//method for scanning triangle dimensions from keyboard 
    public static int getTriangleDim(){ 
     int triangle = 0; 
     Scanner keyboard = new Scanner(System.in); 
     do{ 
     System.out.print("Enter a non-zero integer length (+/-1 - +/-16): "); 
     triangle = keyboard.nextInt(); 
     if((!(triangle <= 16 && triangle >= 1))&&(!(triangle >= -16 && triangle <= -1))) 
      System.out.println("Inpute value outside of range"); 
     }while((!(triangle <= 16 && triangle >= 1))&&(!(triangle >= -16 && triangle <= -1))); 
     return triangle; 
    } 

ich die Do-While-Schleife müssen weiter, aber ich halte diese Fehler zu bekommen.

+0

Sie können eine neue Exception 'Klasse NotIntegerException extends Exception definieren {..}' und fangen sie draußen, um es von anderer Art von Ausnahmen jetzt –

Antwort

2

Es ist nicht erforderlich, im catch Block nach Eingabe zu fragen. Sie befinden sich bereits in einer Schleife, sodass Sie die Ausnahme abfangen, dem Benutzer sagen können, dass er Ihnen gültige Eingaben geben soll, und dann müssen Sie nichts anderes tun - Sie kehren zum Anfang zurück.

do{ 
    try { 
     triangle = getTriangleDim(); 
     bError=false; 
    } catch (Exception e){ 
     System.out.println("You did not enter an integer, please enter an integer value"); 
     // Don't do anything else in here: we will loop back to the beginning again and get new input! 
    } 
}while (bError); 

Als Randnotiz (und wie Sie bemerkt haben), wird Ihr Code ist nicht kompilieren, wenn Sie triangle außerhalb dieses try Block zu verwenden versuchen, weil "triangle might not have been initialized". Dies ist aufgrund der Tatsache, dass der Compiler : das heißt, der Compiler kann nicht sehen, dass triangle immer innerhalb dieser Schleife initialisiert wird. Daher sollte Ihre Variablendeklaration auch triangle auf einen Standardwert setzen. 0 ist der normale Standard für int, aber verwenden Sie, was auch immer sinnvoll in Ihrem Programm (es sieht aus wie 0 ist in Ordnung, basierend auf Ihrem Code getTriangleDim).

int triangle = 0; 
do { // etc. 

Auf diese Weise können Sie „Versprechen“ der Compiler, der triangle Wert durch die Zeit, haben Sie die Schleife verlassen, und Sie werden es benutzen anderswo können.

+0

Dank, ich fühle mich dumm zu unterscheiden. Ich habe meinen Code aktualisiert, um den Scannereingang im Catch-Block zu entfernen. Aber jetzt bekomme ich einen anderen Fehler, der Compiler gibt mir den folgenden Fehler "Unkompilierbarer Quellcode - variables Dreieck wurde möglicherweise nicht initialisiert". Auch nach meiner Do-while-Schleife und verschachtelten try-catch-Anweisungen ist jeder Verweis auf die traindle-Variable rot unterstrichen. Ich verstehe nicht, es scheint, als ob mein Programm nicht erkennt, dass es mit einem Wert initialisiert wurde? – FluffyKittens

+1

@Adam Der Compiler lügt nicht! * Sie * können sehen, dass es beim Beenden der Schleife initialisiert werden sollte, aber der Compiler [kann nicht vorhersagen, wie Ihr Programm läuft] (http://en.wikipedia.org/wiki/Halting_problem). Soweit der * Compiler * betroffen ist, könnten Sie die Schleife verlassen, ohne das Dreieck zu initialisieren.Sehen Sie [diese Frage] (http://stackoverflow.com/q/14790940/2069350) für ein Beispiel ähnlich dem Ihren, aber der Punkt ist, dass Sie 'triangle' auf einige Standardwerte initialisieren müssen (' 0' und '-1 'sind üblich) * vor * der Schleife, in der du die echte Zuweisung machst (zB' int triangle = 0; '). –

+0

Thnaks! Ich schätze die Hilfe. – FluffyKittens