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