不好意思,我没说清楚;我理解的这个程序是这样的,在没有input.nextLine()的情况下,首先让我输入一个整数,如果我输入一个3.5,则抛出InputMisMatchException异常,导致boolean值没被改变去处理异常,输出again,然后判断boolean值,依然为真,所以进入第二次循环,number重新被申明,应该让我重新输入值,但是这是却一直循环输出“again;” 按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。不好意思,我没说清楚;我理解的这个程序是这样的,在没有input.nextLine()的情况下,首先让我输入一个整数,如果我输入一个3.5,则抛出InputMisMatchException异常,导致boolean值没被改变去处理异常,输出again,然后判断boolean值,依然为真,所以进入第二次循环,number重新被申明,应该让我重新输入值,但是这是却一直循环输出“again;” 按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。 你是把input.nextLine()去掉后的结果吗?我如果有input.nextLine()和你的结果一样,如果没有就会使这样的: 你是要去掉的? 去掉肯定死循环了,每次金循环都会跑到input.nextInt(),这个每次都会报错。 看异常堆栈信息: java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:840) at java.util.Scanner.next(Scanner.java:1461) at java.util.Scanner.nextInt(Scanner.java:2091) at java.util.Scanner.nextInt(Scanner.java:2050) at Test.main(Test.java:10)
按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。
按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。不好意思,我没说清楚;我理解的这个程序是这样的,在没有input.nextLine()的情况下,首先让我输入一个整数,如果我输入一个3.5,则抛出InputMisMatchException异常,导致boolean值没被改变去处理异常,输出again,然后判断boolean值,依然为真,所以进入第二次循环,number重新被申明,应该让我重新输入值,但是这是却一直循环输出“again;”
按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。
你是把input.nextLine()去掉后的结果吗?我如果有input.nextLine()和你的结果一样,如果没有就会使这样的:
按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。不好意思,我没说清楚;我理解的这个程序是这样的,在没有input.nextLine()的情况下,首先让我输入一个整数,如果我输入一个3.5,则抛出InputMisMatchException异常,导致boolean值没被改变去处理异常,输出again,然后判断boolean值,依然为真,所以进入第二次循环,number重新被申明,应该让我重新输入值,但是这是却一直循环输出“again;”
按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。
你是把input.nextLine()去掉后的结果吗?我如果有input.nextLine()和你的结果一样,如果没有就会使这样的:
你是要去掉的? 去掉肯定死循环了,每次金循环都会跑到input.nextInt(),这个每次都会报错。
看异常堆栈信息:
java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:840)
at java.util.Scanner.next(Scanner.java:1461)
at java.util.Scanner.nextInt(Scanner.java:2091)
at java.util.Scanner.nextInt(Scanner.java:2050)
at Test.main(Test.java:10)
因为此方法会继续在输入信息中查找行分隔符,所以如果没有行分隔符,它可能会缓冲所有输入信息,并查找要跳过的行.
Scanner input = new Scanner(System.in);
boolean isContinue = true;
do{
try{
System.out.println("Please enter a integer:");
int number = input.nextInt();
System.out.println("The entered number is " + number);
isContinue = false;
}
catch(InputMismatchException e){
// System.out.println("33");
// input.nextLine();
Object obj = input.next();
System.out.println(obj);
}
}while(isContinue);结果:
Please enter a integer:
sss
sss
Please enter a integer://这里阻塞,等待 控制台输入这个问题确实挺有意思的,分析了一下原因,与楼主分享一下
如果 第6行 抛出异常,执行第13行,根据运行结果看,输入流并没有阻塞在这里等待输入,而是直接打印出:sss
说明第6行出现异常之后,流标记位并没有移动(也就是说 标记位 并没有跳到下一个输入位置),而是仍然停留在原来的位置,所以,第13行 得到的数据仍然是 刚才输入的内容(也就是sss)。
因为每次读入的内容都要 转 int ,有异常出现,说明当前输入 非 数字,则需要跳过这个 “非数字”输入,去读取下一个输入,这样才能避免死循环。如果没有 12 或者 13行,则 输入流 标记位 没有移动到 下一个位置,每次第6行读入的都会是sss,然后试图 将 sss 转 int ,所以就出现死循环。(避免的方法就是,将输入流标记位 跳过 sss ,置到下一个输入位置)