当这个方法 checkUserInput()
下面只调用一次(当用户的第一个条目是1到3之间的数字时),就可以了。
但是,当方法被多次调用时,它会按预期打印出正确的错误消息,然后重新运行“enter”。然而,当用户在这一点上输入1到3之间的数字时,程序的运行方式就不同了:它不能将数字识别为数字,或者它不能通过减去1来转换数字,或者它到达末尾并再次运行。
原因是什么?
static List checkUserInput() {
System.out.print("Enter: ");
int g = 0, h = 0;
boolean numeric = true;
boolean numera = true;
Scanner scanner = new Scanner(System.in);
int xAxis = 0, yAxis = 0, a = 0, r = 0;
String m = scanner.next();
try {
yAxis = Integer.parseInt(m);
} catch (NumberFormatException e) {
numeric = false; //
}
if (!numeric) {
System.out.println(" numbers only!"); //exclude letters
checkUserInput();
}
String n = scanner.next();
try {
xAxis = Integer.parseInt(n);
} catch (NumberFormatException e) {
numera = false; //
}
if (!numera) {
System.out.println(" numbers only!"); //exclude letters
checkUserInput();
} else if (xAxis < 1 || xAxis > 3 || yAxis < 1 || yAxis > 3) {
System.out.println("1 to 3 only!");
checkUserInput();
} else {
//inputs that pass all tests can proceed
//assign array indices to respective coordinates
g = yAxis - 1;
h = xAxis - 1;
}
cords = new ArrayList<Integer>();
cords.add(g);
cords.add(h);
return cords;
}
1条答案
按热度按时间holgip5t1#
checkUserInput();
你似乎认为这会让执行重新回到起点。不,它没有-java方法是可重入的。它将运行checkuserinput方法的另一个“副本”,一旦返回,它将继续运行。所以,如果第一个scanner.next()
call返回一个非数字值,即'numbers only!'错误处理块将再次运行整个方法,并且一旦整个方法完成,将在继续String n = scanner.next()
,造成混乱。这也意味着,如果你输入错误的次数足够多,你的代码将爆炸与StackOverflowerError。
我强烈建议你不要调用你自己的方法。改用(do/)while循环。