Java Problem mit Exception in while Schleife

G

gast_013

Guest
Habe gerade folgendes Programm geschrieben:
Code:
import java.util.Scanner;

public class CQuad {
	public static void main(String[] args) {
		//Variablen und Gesamtzeit-Stoppen beginnen
		long start = System.currentTimeMillis();
		int nummer;
		Scanner keyboard = new Scanner(System.in);
		
		//Wert einlesen
		while(true)
		{
			try {
				System.out.print("Bitte Zahl eingeben: ");
				nummer = keyboard.nextInt();
				break;
			} catch(Exception e) {
				System.out.println("Fehler! ");
				continue;
			}
			
		}
		
		//Rechenzeit-Stoppen beginnen
		long rechenzeit = System.currentTimeMillis();
		//Restliche Variablen
		int[] zahl = new int[nummer];
		String zaehler = "";
		
		//Berechnung
		for(int c = 0; c < zahl.length; ++c) {
			zahl[c] = (c+1) * (c+1);
			System.out.print(zahl[c] + " ");
			zaehler += zahl[c];
		}
		//Ergebnisse ausgeben
		System.out.println("\nGesamte Zeichen: " + (zaehler.length() + (nummer - 1)));
		//Zeit-Stoppen beenden und benötigte Zeit ausgeben
		long ende = System.currentTimeMillis();
		System.out.println("Benötigte Rechenzeit: " + (ende - rechenzeit) + " ms.");
		System.out.println("Benötigte Gesamtzeit: " + (ende - start) + " ms.");
	}
}

Nun zu meinem Problem: Es muss ja eine Ganzzahl eingegeben werden. Falls jetzt z.B. Eine Kommazahl eingeben wird, kommt die Exception zum Einsatz. Mit continue möchte ich, dass die while-Schleife von neuem beginngt, das klappt aber nicht richtig, denn es kommt nur noch:
Bitte Zahl eingeben: Fehler!
Bitte Zahl eingeben: Fehler!
Bitte Zahl eingeben: Fehler!
Bitte Zahl eingeben: Fehler!
Bitte Zahl eingeben: .... usw.

Wie muss ich die Exception (bzw. den catch-Block) umschreiben, dass ich die Zahl neu eingeben kann?
 
Du hast dir eine 1A Endloschleife gebaut:

Code:
while([B][I]true[/I][/B])
{

	//mach was		
}

Die Bedingung der while-Schleife ändert sich ja nie und somit wird sie bis in alle Ewigkeit ausgeführt.
 
@Spontan: erst lesen, dann posten. Er geht mir "break;" aus der Schleife raus. Nur falls ain Fehler auftritt, geht die Schleife mit "continue;" weiter.

@Topic: Unter Java hab ich diese Art der Eingabe noch nie probiert, hatte aber nen ähnlichen Fehler mal unter C++, was ja zumindest weitgehend Syntaxkompatibel ist. Das Problem war damals dass eben die Eingabe falsch war, der Wert daher nicht in die Variable geschrieben wurde und somit der Eingabepuffer nicht geleert wurde. Beim nächsten Schleifendurchlauf stand die Eingabe immer noch im Puffer und wurde erneut ausgewertet, das Ergebnis kennst du.
Ich würde dir einfach ne andere Eingabelösung vorschlagen: Lies den Wert als String ein und prüf erst nach der Eingabe auf Ganzzahl ab. Geht zum Beispiel mit Methoden wie "isnumeric()" (oder so ähnlich). Das Ganze packst du in deine while-Schleife (oder noch besser repeat) und nimmst diese Prüfung als Abbruchbedingung. Solange keine ganze Zahl eingegeben wurde geht's eben wieder von vorn los.
Durch das Einlesen als String und nachträgliche Prüfung umgehst du das Problem mit dem Eingabepuffer und kommst gleichzeitig von dem "break" und "continue" weg, welches sowieso nur im Notfall oder zur Laufzeitoptimierung angewendet werden sollte.

Gruß,

Chris
 
Zurück
Oben Unten