如何解决 for 循环中的 try-catch 问题?
how can I resolve try-catch issue within for loop?
我的代码快完成了。这是一个猜数字的游戏。最后一部分是实现 try-catch 函数,以便程序捕获无效输入,例如大于 50 的数字或输入字母或任何符号。
代码如下:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
//number generator
int number = 1 + (int)(50 * Math.random());
int i, guess;
int g = 50;
for (i = 0; i < g; i++) {
try {
System.out.println("Guess a number between 1 to 50!");
guess = s.nextInt();
if (guess == number) {
System.out.println("You got it in " + i + " tries.");
System.out.println("The number was: " + number);
break;
} else if (guess < number) {
System.out.println("Too low. Try Again.");
} else if (guess > number) {
System.out.println("Too high. Try Again.");
}
} catch (Exception e) {
System.out.println("Oops you entered an invalid input. Try Again.");
}
}
}
}
所以我们不要谈论干净的代码,我只是想更正您的 catch 子句。
主要问题是,如果 .nextInt()
是无效输入,扫描器不会消耗它。
这意味着在捕捉到你的异常之后,该行仍然存在,并将在你的下一次迭代中自动再次读取。从理论上讲,这将以无限循环结束,但由于您的结构,您的循环受到 int g = 50;
.
的限制
我知道的唯一(而且不是那么干净)解决方案是,让扫描器简单地使用 .nextLine()
或 .next()
.
来处理下一行
@Chaosfire 提到的解决方案要好得多。
guess = Integer.parseInt(s.nextLine());
您将首先阅读该行,无论其内容是什么。之后您尝试将内容解析为整数。如果输入无效,该方法将抛出一个 NumberFormatException
,您可以在 catch 子句中捕获它。
循环建议
for(i = 0; i < g; i++) {
System.out.println("Guess a number between 1 to 50!");
try {
guess = Integer.parseInt(s.nextLine());
if((guess < 1) || (guess > 50)) {
throw new Exception("Integer is not in Range between 1 and 50");
}
if(guess == number) {
System.out.println("You got it in " + i + " tries.");
System.out.println("The number was: " + number);
break;
}
else if(guess < number) {
System.out.println("Too low. Try Again.");
}
else if(guess > number) {
System.out.println("Too high. Try Again.");
}
}
catch(Exception e) {
i--;
System.out.println("Oops you entered an invalid input: " + e.getMessage() + "\nTry Again.");
}
}
我的代码快完成了。这是一个猜数字的游戏。最后一部分是实现 try-catch 函数,以便程序捕获无效输入,例如大于 50 的数字或输入字母或任何符号。
代码如下:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
//number generator
int number = 1 + (int)(50 * Math.random());
int i, guess;
int g = 50;
for (i = 0; i < g; i++) {
try {
System.out.println("Guess a number between 1 to 50!");
guess = s.nextInt();
if (guess == number) {
System.out.println("You got it in " + i + " tries.");
System.out.println("The number was: " + number);
break;
} else if (guess < number) {
System.out.println("Too low. Try Again.");
} else if (guess > number) {
System.out.println("Too high. Try Again.");
}
} catch (Exception e) {
System.out.println("Oops you entered an invalid input. Try Again.");
}
}
}
}
所以我们不要谈论干净的代码,我只是想更正您的 catch 子句。
主要问题是,如果 .nextInt()
是无效输入,扫描器不会消耗它。
这意味着在捕捉到你的异常之后,该行仍然存在,并将在你的下一次迭代中自动再次读取。从理论上讲,这将以无限循环结束,但由于您的结构,您的循环受到 int g = 50;
.
我知道的唯一(而且不是那么干净)解决方案是,让扫描器简单地使用 .nextLine()
或 .next()
.
@Chaosfire 提到的解决方案要好得多。
guess = Integer.parseInt(s.nextLine());
您将首先阅读该行,无论其内容是什么。之后您尝试将内容解析为整数。如果输入无效,该方法将抛出一个 NumberFormatException
,您可以在 catch 子句中捕获它。
循环建议
for(i = 0; i < g; i++) {
System.out.println("Guess a number between 1 to 50!");
try {
guess = Integer.parseInt(s.nextLine());
if((guess < 1) || (guess > 50)) {
throw new Exception("Integer is not in Range between 1 and 50");
}
if(guess == number) {
System.out.println("You got it in " + i + " tries.");
System.out.println("The number was: " + number);
break;
}
else if(guess < number) {
System.out.println("Too low. Try Again.");
}
else if(guess > number) {
System.out.println("Too high. Try Again.");
}
}
catch(Exception e) {
i--;
System.out.println("Oops you entered an invalid input: " + e.getMessage() + "\nTry Again.");
}
}