java.util.Scanner:为什么我的nextDouble()没有提示?

时间:2011-06-16 15:42:05

标签: java java.util.scanner

import java.util.*;

public class June16{
    public static void main(String[] args){
        Scanner kb = new Scanner(System.in);
        double b=0;
           boolean checkInput = true;
        do{
            try{
                System.out.println("Input b : ");
                b = kb.nextDouble();
                checkInput = false;
            }catch(InputMismatchException ime){
            }
        }while(checkInput);
    }
}

抛出InputMismatchException后,为什么我的程序没有提示输入? :d

3 个答案:

答案 0 :(得分:4)

来自documentation

  

当扫描程序抛出InputMismatchException时,扫描程序将不会传递导致异常的标记,因此可以通过其他方法检索或跳过它。

这就是为什么如果你没有输入有效的双重结果,你最终会陷入无限循环。处理异常时,请使用kb.next()移至下一个标记。

答案 1 :(得分:2)

因为如果Scanner.nextDouble()失败,它会将令牌留在队列上(然后再次读取,然后再一次失败)。

尝试以下方法:

try {
    // ...
} catch (InputMismatchException ime) {
    kb.next();  // eat the malformed token.

}

ideone.com demo illustrating working example

答案 2 :(得分:1)

这是因为nextDouble将采用您输入的十进制数字,但仍然存在您输入的回车符,扫描仪未读取该回车符。下次循环时它会读取输入,但是等等!那里有回车,所以......不需要扫描任何东西。它只是处理回车。当然,程序发现它不是双倍的,所以你得到一个例外。 你是如何解决的?好吧,有东西可以扫描nextDouble留下的剩余物(即下一个()),然后再次扫描下一个双倍。