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

时间:2014-02-10 00:54:42

标签: java loops while-loop

我有以下内容:我很清楚,如果输入的输入不是数字,我必须抓住一个例外,是什么让我发疯只是在第一次运行时这个功能是否有意为止点。当我请求用户输入他们的体重时,它会在while(!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;
        }
    }   
}
}

1 个答案:

答案 0 :(得分:0)

第一个问题是如果hasNextInt()为假,则需要做一些事情让扫描仪超过非法输入。如果不这样做,扫描仪的光标(指向要查看的下一个输入)将永远保持在同一个地方,从而导致无限循环。如果在hasNextInt()为false时执行此操作:

sc.nextLine();

将清除该行上的所有其他内容,允许用户输入新输入。

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