Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无限循环第二次使用扫描仪_Java_Loops_While Loop - Fatal编程技术网

Java 无限循环第二次使用扫描仪

Java 无限循环第二次使用扫描仪,java,loops,while-loop,Java,Loops,While Loop,我有以下几点:我很清楚,我有一个例外,我必须抓住,如果输入的不是数字,让我疯狂的是,只有在第一次运行时,这个函数才能按预期运行到这一点。当我请求用户输入他们的权重时,它会进入上的无限循环,而(!isNum)。我本以为关闭扫描仪,在第二次运行时重新创建对象会创建一个停止点,允许用户输入数据。我正在使用Eclipse Kepler,它是IDE和Java的新手,作为初学者,我正在将其与C#进行比较。请给我一点指导 import java.text.NumberFormat; import java.u

我有以下几点:我很清楚,我有一个例外,我必须抓住,如果输入的不是数字,让我疯狂的是,只有在第一次运行时,这个函数才能按预期运行到这一点。当我请求用户输入他们的权重时,它会进入
上的无限循环,而(!isNum)
。我本以为关闭扫描仪,在第二次运行时重新创建对象会创建一个停止点,允许用户输入数据。我正在使用Eclipse Kepler,它是IDE和Java的新手,作为初学者,我正在将其与C#进行比较。请给我一点指导

import java.text.NumberFormat;
import java.util.InputMismatchException;
import java.util.Locale;
import java.util.Scanner;
import java.util.regex.MatchResult;

import org.omg.CORBA.DynAnyPackage.TypeMismatch;

public class TheValidator {

private int height;
private int weight;
private boolean isNotValid = true;
private boolean weightIsValid = false;
private Scanner sc;

void inputTest(){
    while (!isNotValid);{
        System.out.print("Please enter your height in inches.");
        numTest();
    }
    isNotValid = true;
    while (!isNotValid);{
        System.out.print("Please enter your weight in inches.");
        numTest();
    }
    sc.close();
}


void numTest()
{
    // Variable to see if entered data is legit number. 
    while(isNotValid)
    {
        boolean isNum = false;
        boolean isPos = false;
        int num = 0;

        while(!isNum)
        {
            if(sc.hasNextInt())
            {
                isNum = true;
                num = sc.nextInt();
                if(num > 0)
                {
                    isPos = true;
                }
                else
                {
                    System.out.println("You entered a number that is not positive. Please ensure you entered a positive numeric number and try again.");
                }                       
            }
            else
            {
                System.out.println("What you entered isn't even a number. Please ensure you entered a positive numeric number and try again.");
            }           
        }
        if(isNum && isPos)
        {
            isNotValid = false;
        }
    }   
}
}

第一个问题是,如果
hasnetint()
为false,则需要采取措施使扫描仪通过非法输入。如果不这样做,扫描仪的光标(指向要查看的下一个输入)将永远保持在同一位置,导致无限循环。如果在
hasNextInt()
为false时执行此操作:

sc.nextLine();
这将清除行中的所有其他内容,允许用户输入新的输入


这个修正是不够的;当我添加这个时,我得到了其他的例外,我认为这与您正在为每个输入行打开一个新的
扫描仪有关。这应该没有必要。当创建验证程序时,您可以将
sc
初始化为新的
扫描仪
;您可能需要在关闭扫描仪的验证器中添加一个
close
方法。

我想我对验证器的实际操作有点困惑。它讨论了这种方法“使扫描器超过当前行并返回被跳过的输入”。我想我有点困惑。我确实成功地对上面的内容进行了一些修改。在你看来,如果我理解正确的话,ajb nextLine()的行为有点像重置。我想我需要hasNextInt(),因为我用它来验证输入的内容实际上是数字。欣赏pointers@TargetofGravity
nextLine()。在很多情况下,您需要检索行的其余部分并使用它。在这里,我没有为结果分配任何内容,这意味着我们只是将其扔掉,但我们真正想要的只是跳过当前行的效果(因此,当我们要求扫描仪获取更多数据时,会迫使用户输入另一行)。