3

为什么在下面的代码中,您可以连续在扫描仪中输入数字?我觉得代码在输入双精度时会导致无限循环,因为

userInput.hasNextDouble()

总是正确的,因为 userInput 的值在整个循环中不会改变。

我想解释一下为什么 while 条件不会导致无限循环。

 public class Testing
    {
        public static void main(String[] args) 
        { 
            System.out.println("Enter numbers: ");
            Scanner userInput = new Scanner(System.in);
            int currentSize = 0;
            while (userInput.hasNextDouble()) 

            {

                    double nextScore = userInput.nextDouble();

                    currentSize++;


            }
            System.out.println(currentSize); 
            }




        }
4

3 回答 3

1

扫描器类基本上扫描输入到输入流中的令牌。当您调用 ahasNextDouble()或任何hasNext方法时,它将尝试查看流中的下一个标记。它会在返回值之前等待令牌存在,然后调用nextDouble()将获取该令牌并将其从流中清除,因此当您返回hasNextDouble()它时将等到您将另一个令牌输入token流中。

于 2013-07-14T07:07:36.560 回答
0

hasNextDouble()是一种指示是否输入了双精度的方法。如果在该代码中,用户输入的不是双精度数,例如 a charor boolean,代码将跳出循环并打印currentSize。更好的做法是这样的:

        System.out.println("Enter numbers: ");
        Scanner userInput = new Scanner(System.in);
        int currentSize = 0;
        char choice = 'c';
        while (choice != 't') 

        {

                double nextScore = userInput.nextDouble();

                currentSize++;
                System.out.println("Enter \"c\" to enter more numbers, or \"t\" to exit.");
                choice = userInput.nextChar();
        }
        System.out.println(currentSize); 
        }
于 2013-07-14T07:03:36.950 回答
0

来自Scanner的 javadoc

next() 和 hasNext() 方法及其原始类型的伴随方法(例如 nextInt() 和 hasNextInt())首先跳过与分隔符模式匹配的任何输入,然后尝试返回下一个标记。hasNext 和 next 方法都可能阻塞等待进一步的输入。hasNext 方法是否阻塞与其关联的 next 方法是否会阻塞没有关系。

因此,如果您不输入双精度数,您将立即退出该 while 循环。

于 2013-07-14T07:07:24.997 回答