在java Scanner.next()中

时间:2012-07-24 14:34:54

标签: java java.util.scanner

public class Calculator
{

    public static void main(String[] args)
    {
        boolean isValid = false;
        Scanner myScanner = new Scanner(System.in);
        String customerType = null;
        System.out.print("Customer Type? (C/R) ");
        customerType = myScanner.next();
        while (isValid == false)
        {
            System.out.print("Enter Subtotal: ");

            if (myScanner.hasNextDouble())
            {
                double sobTotal = myScanner.nextDouble();
                isValid = true;
            }
            else
            {
                System.out
                        .println("Hay! Entry error please enter a valid number");
            }
            myScanner.nextLine();
        }
    }
}

嗨,我是java新手,像往常一样在扫描仪类中尝试一些东西。

有没有办法查看扫描仪的输入? 因为你会看到我在这里遇到上面代码的问题。这是我输入错误数据后控制台窗口的输出。而不是数字我输入KKK所以有人可以解释我为什么我得到这个错误消息2次?

"this is the console" 
Customer Type? (C/R) R
Enter Subtotal: KKK
Hay! Entry error please enter a valid number
Enter Subtotal: Hay! Entry error please enter a valid number
Enter Subtotal: 

3 个答案:

答案 0 :(得分:2)

按如下方式更改您的代码。

boolean isValid = false;
Scanner myScanner = new Scanner(System.in);
String customerType = null;
System.out.print("Customer Type? (C/R) ");
customerType = myScanner.next();

while (!isValid)
{
    System.out.print("Enter Subtotal: ");

    if (myScanner.hasNext())
    {
        try
        {
            double sobTotal =Double.parseDouble(myScanner.next());
            isValid = true;
        }
        catch(Exception e)
        {
            System.out.println("Hay! Entry error please enter a valid number");
        }
    }
}

使用Scanner.nextDouble()时,它不会消耗新行(或其他分隔符)本身,因此返回的下一个标记通常是空字符串。

答案 1 :(得分:1)

我认为真正的问题是你的循环结构中有一些混淆,这使得每次迭代循环都很难理解扫描器的输入和输出条件。

继承人真正发生的事情。我们在Scanner中输入一个不是双精度令牌的循环。我们问扫描器中有hasNextDouble()的下一个双,由于一个令牌无法转换为double,因此返回false。我们报告错误,isValid仍然是错误的。在分支之后,我们调用scanner.next()并使用非双重令牌。我们租用循环,因为isValid仍然是假的。我们再次询问扫描仪中是否存在双重下一个。现在扫描程序是空的,因为我们消耗了令牌,并且此调用返回false,因此我们报告了另一个错误。现在我们再次致电scanner.next()。由于扫描程序现在为空,而scanner.next()实现了同步消息传递(I / O),我们现在会阻塞,直到扫描程序收到新令牌,因此程序将停止,直到您输入新令牌。尝试在控制台中添加更多内容。您可能会重复循环并看到另一个错误。

您想要完成的是每个循环,使用一个令牌。如果该令牌是双精度型,则接受输入并继续,如果不报告错误并重复。尝试这样的事情,它应该更清楚地显示扫描仪在每个循环中做什么。

public class Calculator
{

    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);

        String customerType = null;

        System.out.print("Customer Type? (C/R) ");
        customerType = scan.next();

        Double test = null;
        do{
            try{
                test = scan.nextDouble();       
            }catch (InputMismatchException ime){ //will be thrown if the token we input is not a double
                System.err.println("Error Message");
            }
        }while(test == null);
    }
}

请注意,我使用的是包装类Double,而不是主要的double。这样我就可以将double设置为null,因为DoubleObject而不是原语。

答案 2 :(得分:1)

问题是你正在调用scanner.nextdouble(),如果输入中有一个double,它将正常工作。如果输入中没有double,则调用nextDouble()会忽略输入“KKK”并显示错误消息,然后当您调用nextLine()时,相同输入“KKK”仍然在等待时你循环回来,然后“KKK”然后传回你的程序,因为它仍然不是一个双倍,你得到重复的错误信息。

试试这个:

    boolean isValid = false;
    Scanner myScanner = new Scanner(System.in).useDelimiter("\\n");
    String customerType = null;
    System.out.print("Customer Type? (C/R) ");
    customerType = myScanner.next();
    while (!isValid)
    {
        System.out.print("Enter Subtotal: ");

        if (myScanner.hasNextDouble())
        {
            double sobTotal = myScanner.nextDouble();
            isValid = true;
        }
        else
        {
            System.out.println("Hay! Entry error please enter a valid number");

            if(myScanner.hasNext()){
              myScanner.next();
            }
        }
    }

这将消耗“KKK”的无效输入并让程序继续正常。