在Java中,使用扫描器读取输入会导致无限循环

在Java中,使用扫描器读取输入会导致无限循环,java,while-loop,infinite-loop,ioexception,Java,While Loop,Infinite Loop,Ioexception,在我的程序中,我试图让用户输入一个介于1-3之间的整数,然后根据他们输入的内容做一些事情。如果它不是一个数字或不是一个选项,那么它将允许他们重新输入一个有效的选项 我遇到的问题是,我很难头脑风暴,如何不让它无限循环,只允许他们在控制台告诉他们输入了无效输入后输入一个数字 int i = 0; while (i < 1) { try { int level = scan.nextInt(); i+=1; if (level == 1)

在我的程序中,我试图让用户输入一个介于1-3之间的整数,然后根据他们输入的内容做一些事情。如果它不是一个数字或不是一个选项,那么它将允许他们重新输入一个有效的选项

我遇到的问题是,我很难头脑风暴,如何不让它无限循环,只允许他们在控制台告诉他们输入了无效输入后输入一个数字

int i = 0;
while (i < 1) {
    try {
        int level = scan.nextInt();
        i+=1;
        if (level == 1) {
            System.out.println("You selected level 1!");
            //Start the game
        } else if (level == 2) {
            System.out.println("You selected level 2!");
            //Start the game
        } else if (level == 3) {
            System.out.println("You selected level 3!");
            //Start the game
        } else {
            System.out.println("That's not an option!");
            i-=1;
        }
    } catch(InputMismatchException input) {
        System.out.println("That's not an option!");
        i-=1;
    }
}
inti=0;
而(i<1){
试一试{
int level=scan.nextInt();
i+=1;
如果(级别==1){
System.out.println(“您选择了级别1!”);
//开始比赛
}否则如果(级别==2){
System.out.println(“您选择了级别2!”);
//开始比赛
}否则如果(级别==3){
System.out.println(“您选择了级别3!”);
//开始比赛
}否则{
System.out.println(“这不是一个选项!”);
i-=1;
}
}捕获(输入不匹配异常输入){
System.out.println(“这不是一个选项!”);
i-=1;
}
}

这不是您期望的答案,但是:重构此代码。记住java的基础知识,每个函数位都有自己的方法。因此,请使用读取输入并返回所选级别的方法(如果没有,则返回-1):

然后为您的读取循环调用:

int selected;
do {
  selected = readInput();
} while(selected < 1);
int选中;
做{
selected=readInput();
}while(选择<1);

您最好这样编写代码:

while(true){
    try{
        int level = scan.nextInt();
        if(level==1){
            System.out.println("You selected level 1!");
            break;
        }else if(level==2){
            System.out.println("You selected level 2!");
            break;
        }else if(level==3){
            System.out.println("You selected level 3!");
            break;
        }else{
            System.out.println("That's not an option!");
            continue;
        }
    }catch(InputMismatchException input){
        System.out.println("That's not an option!");
        continue;
    }
}
continue
将立即恢复顶部循环的执行,
break
将立即跳转while的右大括号
}
。这将删除
i
计数器变量的使用,该变量对代码完全无用。此外,此代码永远不会无限期运行,除非用户无限期地输入不正确的值


希望这有帮助,祝你好运

输入无效输入时,需要将其清除。在触发输入异常时添加
scan.next()
,以便用以下命令清除该异常:


你可以用一种简单得多的方式进行。这3个有效案例非常相似,可以视为一个,游戏只能在循环结束后启动一次,因为我们知道一旦循环结束,
level
具有有效值

boolean valid = false;
int level;
do  {
    try {
        level = scan.nextInt();
        valid = 1 <= level && level <= 3;

        if (valid) {
            System.out.println(String.format("You selected level %d !",level));    
        } else {
            System.out.println("That's not an option!");
        }
    } catch(InputMismatchException input) {
        scan.next();
        System.out.println("That's not an option!");
    }
} while (!valid);

// start the game
boolean valid=false;
智力水平;
做{
试一试{
级别=scan.nextInt();

valid=1不清楚您想要实现什么我需要一种方法来检查用户是否在1-3之间输入了有效的输入,但是如果他们没有,他们就有能力重新输入有效的输入。请看我的答案,我认为这比当前接受的答案好,因为代码已分解,循环的退出条件更清晰。使用
while(对)
带中断的循环不是一个好的编程style@Dici是的,我做到了,我实现了这一点,代替了我所知道的。好吧,我说当接受的答案不是当前答案时。我确实没有看到
catch
子句中的问题,因此我的答案并不完全是我所需要的。谢谢,如果不是,那就另当别论了嘿,输入一个不是数字1的整数-3@BlueMoon不,不会。例如,输入
4
不会抛出任何异常(除非您自己抛出),即使它是无效的input@BaileyTincher我明白了,这很有道理。
 catch(InputMismatchException input) {
        System.out.println("That's not an option!");
        scan.next();
        i-=1;
    }
boolean valid = false;
int level;
do  {
    try {
        level = scan.nextInt();
        valid = 1 <= level && level <= 3;

        if (valid) {
            System.out.println(String.format("You selected level %d !",level));    
        } else {
            System.out.println("That's not an option!");
        }
    } catch(InputMismatchException input) {
        scan.next();
        System.out.println("That's not an option!");
    }
} while (!valid);

// start the game