我有这个代码,我试图通过扫描仪类从用户获取输入。我无法在输入控制台中输入任何内容。没有例外。只是计算机正在等待输入,我键入的内容未在控制台中显示。
import java.util.HashMap;
import java.util.Scanner;
class DataBreach extends Exception{}
public class tictactoe{
char[] data = new char[]{' ',' ',' ',' ',' ',' ',' ',' ',' '};
HashMap<Integer, Character> XO = new HashMap<Integer, Character>();
void assignplayercharacter(){
Scanner scan = new Scanner(System.in);
while (true){
String xo;
System.out.print("Enter the player1 character(X or O):");
while(!(scan.hasNext())){}
xo = scan.next();
if((xo.equals("x"))||(xo.equals("o"))||(xo.equals("X"))||(xo.equals("O"))){
char x_o = xo.toUpperCase().charAt(0);
XO.put(1,x_o);
x_o = ((xo.toUpperCase().equals("X"))?'O':'X');
XO.put(2,x_o);
break;
}
}
scan.close();
}
void play(int player){
Scanner scan = new Scanner(System.in);
while (true){
int pos;
System.out.print("Player"+player+"'s turn:");
while(!(scan.hasNext())){}
try{
pos = Integer.parseInt(scan.next());
if(data[pos-1]!=' '){
throw new DataBreach();
}
data[pos-1] = XO.get(player);
break;
}
catch(java.util.InputMismatchException e){
System.out.println("Please enter only numbers from 1-9");
String leftover = scan.nextLine();
}
catch(java.lang.ArrayIndexOutOfBoundsException e){
System.out.println("Please enter numbers only from 1-9");
}
catch(DataBreach e){
System.out.println("That spot is already occupied. Please choose another spot");
}
}
scan.close();
}
void game(){
assignplayercharacter();
play(1);
}
public static void main(String args[]){
tictactoe obj = new tictactoe();
obj.game();
}
}
当我运行这个程序时,我能够获得第一个方法void assignplayercharacter的输入,但是第二个函数是void play(int player)。程序正在运行,控制台正在等待输入,但是当我输入时,控制台上没有出现该字符。如果我注释掉第一个方法void assignplayercharacter并且只是尝试运行void play(int player),我能够读取用户的输入。
void assignplayercharacter() - 该函数获取输入并将数据输入HashMap。
void play(int player) - 该函数从用户获取输入,并根据给定的输入修改char []数据数组中的字符。
P.S我只是在收到用户的输入时遇到问题。
java.util.Scanner.close()
方法关闭了扫描仪。如果您关闭了Scanner object
,则无法从控制台获取输入。因此,从代码中删除scan.close()
,它将像魅力一样工作。最后只关闭扫描仪对象。 More on Scanner class and its methods
删除此行并再试一次:scan.close();
第一行。
扫描仪应仅在最后关闭。
PS:为了使游戏工作,删除break;
函数内的void play(int player)
。