我有以下方法
public static int modeChooser(){
int choice = 0;
Scanner kb = new Scanner(System.in);
while(choice == 0){
try {
choice = kb.nextInt();
} catch (Exception e) {
continue;
}
if(choice < 1 || choice > 5){
continue;
}
}
return choice;
}
目标是只允许用户输入1,2,3,4或5; 如果用户键入一个字符串或太高/太低的数字,该方法应该重新启动,直到我有正确的int。
以下是该流程的示例:
用户类型:1 - &gt;一切都好 用户类型:saddj - &gt;方法重启 - &gt;用户类型3 - &gt;好的
有什么想法吗?
答案 0 :(得分:2)
更改为:
do {
// read choice value
if (choice < 1 || choice > 5) {
// hint to user
}
} while(choice < 1 || choice > 5);
答案 1 :(得分:1)
您可以直接在while条件中选择条件:
while(choice < 1 || choice > 5){
try {
choice = kb.nextInt();
} catch (Exception e) {
continue;
}
}
(在你当前的代码中,用户输入7,选择取值,while条件变为false,你的方法返回7,它不应该)。
而不是捕获异常,您可以使用hasNextInt()
方法使代码更清晰:
public static int modeChooser() {
int choice = 0;
Scanner kb = new Scanner(System.in);
while (choice < 1 || choice > 5) {
if (!kb.hasNextInt()) {
kb.next();
} else {
choice = kb.nextInt();
}
}
return choice;
}
如果您确实想使用递归方法,它可能如下所示:
public static int modeChooser() {
Scanner kb = new Scanner(System.in);
while (!kb.hasNextInt()) {
kb.next();
}
int choice = kb.nextInt();
return (choice >= 1 && choice <= 5) ? choice : modeChooser();
}
答案 2 :(得分:1)
我认为您可以简单地将支票放入while
条件中,如下所示:
while(choice < 1 || choice > 5){
try {
choice = kb.nextInt();
} catch (Exception e) {
//ignore the exception and continue
}
}
答案 3 :(得分:1)
这种方式实际上很好用:
public static int modeChooser(){
int choice = 0;
Scanner kb = new Scanner(System.in);
while(choice == 0){
try {
choice = kb.nextInt();
} catch (Exception e) {
System.out.println("Sorry but you have to enter 1,2,3,4, or 5! Please try again.");
choice = modeChooser();
}
}
if(choice < 1 || choice > 5){
System.out.println("Sorry but you have to enter 1,2,3,4, or 5! Please try again.");
choice = modeChooser();
}
return choice;
}
答案 4 :(得分:1)
如果kb.NextInt()
失败,输入流中的数据仍然存在,则需要跳过它。如果你没有跳过无效数据,循环将继续尝试,并且失败,读取无效输入,导致无限循环。
您可以使用kb.next()
跳过无效输入:
while (true)
{
try
{
choice = kb.nextInt();
if(choice >= 1 && choice <= 5) break;
}
catch (InputMismatchException e)
{
e.printStackTrace();
kb.next();
}
}
答案 5 :(得分:1)
if(choice >= 1 && choice <= 5)
break;
else
choice = 0;
答案 6 :(得分:1)
我认为最好使用Scanner.nextLine()
和Integer.parseInt()
方法:
while(choice < 1 || choice > 5){
try {
choice = Integer.parseInt(kb.nextLine());
} catch (Exception e) {
//...print error msg
}
}