Benutzereingabe über Scanner Klasse korrekt behandeln

stonedzytode

Mitglied
Hallo,
ich stehe gerade vor einem kleinen Problem mit der Verarbeitung von Benutzereingaben und würde gerne wissen ob mein Ansatz korrekt ist, ist leider schon eine Weile her dass ich mit Java richtig zu tun hatte 🙂
Ich möchte eine Benutzereingabe in der Form Spielposition1 "Leerzeichen" Spielposition2 entgegennehmen. Die Eingabe soll lediglich Integer Zahlen berücksichtigen. Zudem müssen immer zwei Positionen eingegeben werden das heißt wenn man nur eine Zahl eingibt soll ebenfalls ein Fehler kommen.

Java:
public void naechsterZug(Spieler amZug) {
	
	
	Scanner s = new Scanner(System.in);
	
	int pos1 = 0;
	int pos2 = 0;
	
	try{
		
		  pos1 = s.nextInt();
		  pos2 = s.nextInt();
		
	}
	
	catch(InputMismatchException e) {
		System.out.println("Kein gültiges Feld eingegeben. Bitte wiederholen sie ihre Eingabe");
		this.naechsterZug(amZug);
		
	}
	System.out.println("Pos1: " +  pos1);
	System.out.println("Pos2: " +  pos2);
	}

Mich stört der rekursive Aufruf abgesehen davon dass es auch nicht wie gewünscht funktioniert. Gibt es eine elegantere Möglichkeit den Benutzer in der Eingabe gefangen zu halten bis sie die gewünschte Form hat?
Viele Grüße
StonedZytode
 
die einfachere Variante ist eine Schleife
und was du ganz dringend vermeiden solltest, ist, ständig einen neuen Scanner auf System.in zu erzeugen,
einer reicht Programm-weit, ruhig vereinfacht in einer statischen Variablen speichern wie System.in selber
 
Java:
private boolean gueltig = false;

public void deineAbfrage(){

   while(!gueltig){
        System.out.println("Pos1");
        pos1 = s.nextInt();
        System.out.println("Pos2");
        pos2 = s.nextInt();

        if(pos1 == ok %% pos 2 == ok){

            gueltig = true;
       }

   }
}
 
Danke schonmal an euch beide. Die Idee mit der while Schleife hatte ich auch schon, hab sie zwischendurch aber verworfen. Ich werds nochmal so probieren 🙂
 
Das Problem was zuvor, als ich die Idee mit der Schleife auch schon hatte, aufgetreten ist, ist dass er nur einmal nach einem gültigen Wert fragt und dann dauerhaft "Kein gültiges Feld eingegeben..." ausgibt. Das heißt er wartet beim zweiten mal nicht auf die Eingabe des Benutzers. Ich glaub das ist irgendein dummer Fehler aber ich seh ihn gerade einfach nicht.
Java:
public void naechsterZug(Spieler amZug) {
	
	boolean gueltig = false;
	int pos1;
	int pos2 ;
	while(!gueltig) {
	try{
			
		  pos1 = s.nextInt();
		  pos2 = s.nextInt();
		  gueltig = true;
		  //if(gueltigerZug(pos1,pos2)) gueltig = true;
		
	}
	
	catch(InputMismatchException e) {
		System.out.println("Kein gültiges Feld eingegeben. Bitte wiederholen sie ihre Eingabe");
		
		
	}

	}
	System.out.println("Ende");
	
}
 
Scanner kennenlernen,
was einmal drin stehen bleibt wird immer wieder abgefragt, wenn nicht übersprungen

mit new Scanner() wird das natürlich als Nebeneffekt umgangen.., alles alte weg,
ansonsten z.B. readLine() aufrufen um einze komplette Zeile zu lesen,
wird eher keine Exception werfen
 
Alternativ die fehlerhafte Eingabe überspringen.

Java:
catch (InputMismatchException e) {
				System.out.println("Kein gültiges Feld eingegeben. Bitte wiederholen sie ihre Eingabe");
				s.nextLine();
			}
 
Wenn ich dich richtig verstanden hab suchst du sowas.

Java:
public class FrageTest {
	int pos1;
	int pos2;
	public boolean gueltig = false;
	
	
	public void nextTurn(){
		
		while(!gueltig){
		
			Scanner s = new Scanner (System.in);
			System.out.println("Bitte Pos1 eingeben");
			
			try {
				pos1 = s.nextInt();
				
			} catch (Exception e1) {
				
				System.out.println("Falscher Wert Pos1 nur Zahlen");
				continue;
			}
			
			System.out.println("Bitte Pos2 eingeben");
			
			try {
				pos2 = s.nextInt();
				
			} catch (Exception e) {
				
				System.out.println("Falscher Wert Pos2 nur Zahlen");
				continue;
			}
		
			gueltig = true;
			
		}
		
		System.out.println(pos1 +" "+pos2);
	}
	
	public static void main(String[]args){
		
		FrageTest f = new FrageTest();
		f.nextTurn();
	}

}

Sorry hatte nicht mitbekommen das du bereits Hilfe bekommen hattest 😉
 
Nebenbei nochmal ein Lob für das Forum, geht ja echt ziemlich fix hier 🙂 Ich hab im letzten Jahr im Studium fast nur Betriebssystemfunktionen in C programmiert. Die Umstellung ist schon komisch irgendwie^^
 

Neue Themen


Zurück
Oben