提问人:smcconville 提问时间:4/9/2021 最后编辑:Anton Krugsmcconville 更新时间:4/25/2021 访问量:69
需要创建输入不匹配异常
Need to create an input mismatch exception
问:
如果输入一个字母,我想在周围放一个 try/catch 来抛出一个 InputMismatchException,我一直得到一个无限循环。这是无限循环的代码。解决这个问题的最佳方法是什么?input=scanner.nextInt
public void setNumberOfPlayers(Scanner scanner) {
boolean valid = false;
this.numberOfPlayers = 0;
int input = 0;
do {
do {
System.out.println("Please enter the number of players (minimum " + MIN_PLAYERS + " & maximum "
+ MAX_PLAYERS + ".)");
try {
input = scanner.nextInt();
}catch (InputMismatchException e ) {
System.out.println("Please type a numeric digit only");
}
// this.numberOfPlayers = scanner.nextInt();
if (input > MAX_PLAYERS || input < MIN_PLAYERS) {
System.out.println("Invalid input. Enter the number of players");
valid = false;
} else {
this.numberOfPlayers = input;
valid = true;
}
} while (input > MAX_PLAYERS || input < MIN_PLAYERS);
System.out.printf("You have chosen to include %d players. is this correct? (Y/N)", this.numberOfPlayers);
String answer = scanner.next();
switch (answer) {
case "y":
case "Y":
System.out.println("Great - lets start the game with " + this.numberOfPlayers + " players");
valid = true;
break;
case "n":
case "N":
System.out.println("Please re-enter the number of players");
// this.numberOfPlayers = scanner.nextInt();
valid = false;
break;
default:
System.out.println("Please enter a valid response - y / n");
valid = false;
break;
}
} while (!valid);
}
答:
我认为这种方法存在多个问题,如果您设置了一个有效的数字,但在第二次检查中没有确认它,那么您将再次进行第一次检查,输入无效字符将不会再次询问您,因为上次输入设置正确。所以我想说你想把“重置”状态移动到循环中:
boolean valid;
int input;
do {
valid = false;
this.numberOfPlayers = 0;
input = 0;
do {
可以在扫描仪上检查“hasNext()”,这样您就知道那里有东西。 您可以测试“hasNextInt()”,而不是检查异常
if (scanner.hasNextInt()) {
System.out.println("Read a int" + scanner.nextInt());
}
但总的来说,我认为它不会继续读取,我认为如果未读取 int,扫描仪中的指针/索引不会进展,因为它不知道那里有什么,以及它需要多少字节才能不破坏接下来的长元、浮点数或任何它会在那里的东西(它不能提前知道)。您可能会给它一个新的输入,但读者仍然没有有效地处理前一个输入,所以它没有进展。
所以我想说更好的办法是读取一行“nextLine()”并确保无论如何都正确读取它,然后才尝试将字符串转换为 int,然后弄清楚输入是否是您想要的。
我看到的其他问题是输入和有效标志有重叠的功能,条件对输入的有效范围进行多次测试(在 if 条件和 while 条件中,重复的代码会导致错误)。也许 while 条件可以改为检查有效标志:
改变:
while (input > MAX_PLAYERS || input < MIN_PLAYERS);
对此:
while (!valid);
而且我不确定是否也很好,setNumberOfPlayers 暗示您将它设置为有效值,那么为什么要同时重置,当两个循环完成然后将其设置为下一个新的有效值时,不要将其重置为无效值在此期间。我想这里没有那么大的问题,因为你没有多线程,但仍然感觉不对。this.numberOfPlayers = 0;
评论