package ex13;
import java.util.*;public class InputMismatchExceptionDemo {

public static void main(String[] args) {
// TODO 自动生成方法存根
Scanner input=new Scanner(System.in);
boolean continueInput=true;

do{
try{
System.out.print("Enter an integer: ");
int number=input.nextInt();

//Display the result
System.out.println("The number entered is "+number);

continueInput=false;
}
catch(InputMismatchException ex){
System.out.println("Try again.("+
"Incorrect input:an integer is required");
//input.nextLine();这句注释掉就会有死循环,不得其解
}
}while(continueInput);
}}input.nextLine();注释掉会陷入死循环中
input.nextLine();这句不是有键盘输入一行字符串吗,在这里有什么作用

解决方案 »

  1.   

    nextLine() 能干掉回车换行符,这就是关键。
      

  2.   

    input.nextLine()这句是为输入的非数字处理而作的。因为如果输入的是非数字,就会catch到InputMismatchException代码块,而不会去把continueInput设置成false,而你的try……catch又是在do…while循环里,如果不读取下一个字符,那么就总是对这个非数字进行处理,总是报错,然后catch,跳过continueInput的处理,当然是死循环了。
      

  3.   

    为什么没有nextLine()就不行,相当于C里的fflush(stdin);吗?回车一直在缓存里?
      

  4.   

    根本不是这个问题,你的 int number=input.nextInt();如果输入的是非数字字符,会抛出一个InputMismatchException异常。
      

  5.   

    可不可以这么理解,当输入不是整数时,这部分输入的值会在缓存里,
    而用了input.nextLine();就能消掉这些非整数
    而如果没有就一直有异常,就没玩没了了
      

  6.   

    这样解释:
    ①nextInt如果没有读取到整数,一方面报异常,另一方面,输入流中的指针不会后移
    ②catch中如果没有nextLine,则输入流中的指针依然不后移
    ③do...while循环上去的时候,重新nextInt,因为输入未变,故依然报异常... 死循环形成catch中加了nextLine时,事情是这样的:
    ① (未变)
    ②catch中nextLine将当前行一直到回车换行符的内容读去,输入流执行下一行
    ③do...while重新nextInt,但试图读入下一行,如果用户依然不输入整数,才会再报异常。(不会立即形成死循环)
      

  7.   

    可以这么理解。API文档nextLine方法说明:此扫描器执行当前行,并返回跳过的输入信息。 此方法返回当前行的其余部分,不包括结尾处的行分隔符。当前位置移至下一行的行首。 因为此方法会继续在输入信息中查找行分隔符,所以如果没有行分隔符,它可能会缓冲所有输入信息,并查找要跳过的