日期:2014-05-20  浏览次数:20812 次

为什么会有死循环
Java code

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();这句不是有键盘输入一行字符串吗,在这里有什么作用

------解决方案--------------------
input.nextLine()这句是为输入的非数字处理而作的。因为如果输入的是非数字,就会catch到InputMismatchException代码块,而不会去把continueInput设置成false,而你的try……catch又是在do…while循环里,如果不读取下一个字符,那么就总是对这个非数字进行处理,总是报错,然后catch,跳过continueInput的处理,当然是死循环了。
------解决方案--------------------
这样解释:
①nextInt如果没有读取到整数,一方面报异常,另一方面,输入流中的指针不会后移
②catch中如果没有nextLine,则输入流中的指针依然不后移
③do...while循环上去的时候,重新nextInt,因为输入未变,故依然报异常... 死循环形成

catch中加了nextLine时,事情是这样的:
① (未变)
②catch中nextLine将当前行一直到回车换行符的内容读去,输入流执行下一行
③do...while重新nextInt,但试图读入下一行,如果用户依然不输入整数,才会再报异常。(不会立即形成死循环)
------解决方案--------------------
可以这么理解。API文档nextLine方法说明:此扫描器执行当前行,并返回跳过的输入信息。 此方法返回当前行的其余部分,不包括结尾处的行分隔符。当前位置移至下一行的行首。 因为此方法会继续在输入信息中查找行分隔符,所以如果没有行分隔符,它可能会缓冲所有输入信息,并查找要跳过的