当前位置: 代码迷 >> J2SE >> 为什么会有死循环解决方案
  详细解决方案

为什么会有死循环解决方案

热度:128   发布时间:2016-04-24 01:57:39.0
为什么会有死循环
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方法说明:此扫描器执行当前行,并返回跳过的输入信息。 此方法返回当前行的其余部分,不包括结尾处的行分隔符。当前位置移至下一行的行首。 因为此方法会继续在输入信息中查找行分隔符,所以如果没有行分隔符,它可能会缓冲所有输入信息,并查找要跳过的
  相关解决方案