如何在while循环中编写新的扫描程序会阻止无限循环?

时间:2014-05-09 18:54:10

标签: java java.util.scanner

所以我试图阻止一个错误发生,如果用户输入1,2,3以外的数字,所以我创建了一个while循环,让程序不断询问用户一个新的数字,如果他们的输入在外面1,2,3。 在我没有

之前
 Scanner user1 = new Scanner(System.in);
 input = user1.nextInt(); 

行,while循环保持无限运行。但是现在代码做了我想要的,它停止并评估新用户输入多次输入错误(我在正确的一个之前输入了3,6,7个错误的值,并且每次都有效) 。

我的问题是,扫描仪如何阻止无限循环?扫描仪实现是否会导致计算机在继续之前等待用户输入,因此它会继续对其进行持续评估,而不是无限制地打印出来"我很抱歉这样做不是有效的输入..." ?我只是想确定我知道为什么它会停止。

Scanner user = new Scanner(System.in);
System.out.println("Hello, what would you like to do?" + "\n" + "1. Search"  + "\n" + "2. Add new instructor" + "\n" + "3. Remove Intsructor");
int input = user.nextInt(); 
boolean valid = false;
while(valid == false)
{
    if(input<3 && input>=1)
    {

        valid = true; 
    }
    else
    {
        System.out.println("I'm sorry, that's not a valid input, please enter 1, 2, or 3."); 
        Scanner user1 = new Scanner(System.in); 
        input = user1.nextInt(); 
    }

2 个答案:

答案 0 :(得分:0)

它通过等待来停止循环。 nextInt()是一种阻塞方法,这意味着当你调用它时,调用它的线程将等到该方法返回一个值,或者块的原因已经完成。

当你调用nextInt()时,你的线程会受到攻击,并等待System.in的某些事情发生。一旦有东西进入,该方法返回值。

如果你把scanner.nextInt()放在你的循环中,那么每个循环迭代将等待用户输入

Scanner scanner = new Scanner(System.in);
boolean valid = true;

while(valid) {
    switch(scanner.nextInt()) {
        case 1:
        case 2:
            valid = false; //if nextInt() is 1 or 2
            break;

        default: //anything else

            break;
    }
}

答案 1 :(得分:0)

考虑一下:

  • 仅当valid设置为true
  • 时,您的循环才会停止 仅当valid为1或2 时,
  • true才设为input
  • 如果input超出有效范围,则valid不会更改
  • 如果input在第一次进入循环时超出范围,则停止循环的唯一方法是更改​​input的值。

没有您添加的两行,即没有

Scanner user1 = new Scanner(System.in);
input = user1.nextInt();

循环不会改变input。因此,如果循环没有立即退出,它将保持无限。

请注意,您无需创建新的扫描仪 - 您可以从循环之前创建的扫描仪中读取,即

input = user.nextInt();

另请注意,在不调用nextInt()的情况下调用hasNextInt()可能会产生异常。