Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo in meinem TicTacToe Spiel wird der Spieler aufgefordert in der Konsole eine Zahl zwischen 1-9 auszuwählen. Damit er sein gewünschtes Spielfeld auswählen kann. Doch wenn man nun ein Buchstabe in die Konsole eingibt, anstatt eine Zahl, dann stürzt das Programm immer ab. Mit was für einem Code kann ich dieses Problem beheben.
Der Scanner wirf eine Exception und diese Exception kannst Du mit try / catch fangen.
Die fehlerhafte Ausgabe musst Du dann aber noch aus dem Scanner Buffer entfernen. Dazu kannst Du z.B. nextLine() aufrufen.
Damit hast Du alles, was Du machen musst.
Also skizziert könntest Du eine Methode schreiben, die so aussieht:
Eingabe-Methode:
Schleife:
- try
- - Frage nach der Eingabe
- - Wenn Eingabe gültig: gib Eingabe zurück
- catch Exception von fehlerhafter Eingabe
- Gib Fehlermeldung aus: Eingabe ungültig.
Ende Schleife
Die Endlosschleife wird nur durch eine gültige Eingabe abgebrochen (durch ein Return). Wenn eine Exception auftritt oder die Eingabe ungültig ist (Also z.B. nicht im Bereich von 1...9), dann wird eine Fehlermeldung ausgegeben und die Schleife beginnt von Anfang an.
Könnten Sie sich kurz meinen Code ansehen. Ich weis nicht wie ich es tun muss.
import java.util.Scanner;
public class HumanPlayer {
static Scanner input = new Scanner(System.in);
public static void playerMove(char[][] gameBoard) {
System.out.println("Wähle ein Feld 1-9");
int move = input.nextInt();
boolean result = Game.validMove(move, gameBoard);
while (!result) {
Sound.errorSound(gameBoard);
System.out.println("Feld ist besetzt!");
move = input.nextInt();
result = Game.validMove(move, gameBoard);
}
System.out.println("Spieler hat diesen Zug gespielt " + move);
Game.placePiece(move, 1, gameBoard);
}
Dein Problem entsteht doch in den zwei Zeilen mit: move = input.nextInt();
input.nextInt() kann eine Exception werfen oder die Zahl kann im falschen Bereich sein. Das ist also doof. Also müssen wir dies ändern.
Aber statt den Code auf zu blähen an der Stelle, schreiben wir einfach eine neue Methode: move = getFieldInput(input);
bzw (da input ja eine Klassenvariable ist): move = getFieldInput();
Den Namen der Methode kannst Du Dir noch frei überlegen. Sollte halt verständlich sein, was die Methode macht wenn man den Namen der Methode liest.
Und in die Methode kannst Du dann das schreiben, was ich schon beschrieben habe:
public static int getFieldInput() {
while (true) {
try {
int field = input.nextInt();
if (field >= 1 && field <= 9) return field;
} catch (InputMismatchException ex) {
input.nextLine(); // Scanner-Puffer von zeichen befreien.
}
System.out.println("Ihre Eingabe war nicht korrekt! Bitte geben sie erneut eine Feldnummer ein:")
}
}
In dem catch Block ist dann halt noch die Bereinigung vom Scanner - das hatte ich ja auch schon angedeutet:
import java.util.Scanner;
public class HumanPlayer {
static Scanner input = new Scanner(System.in);
public static void playerMove(char[][] gameBoard) {
System.out.println("Wähle ein Feld 1-9");
int move = input.nextInt();
boolean result = Game.validMove(move, gameBoard);
while (!result) {
Sound.errorSound(gameBoard);
System.out.println("Feld ist besetzt!");
move = input.nextInt();
result = Game.validMove(move, gameBoard);
}
System.out.println("Spieler hat diesen Zug gespielt " + move);
Game.placePiece(move, 1, gameBoard);
}
}