这个循环本来就是个死循环,用nextLine只是做了等待输入,输入后会继续循环,没有nextLine直接进入下次循环。
可以用break;跳出循环。

解决方案 »

  1.   

    不好意思,我没说清楚;我理解的这个程序是这样的,在没有input.nextLine()的情况下,首先让我输入一个整数,如果我输入一个3.5,则抛出InputMisMatchException异常,导致boolean值没被改变去处理异常,输出again,然后判断boolean值,依然为真,所以进入第二次循环,number重新被申明,应该让我重新输入值,但是这是却一直循环输出“again;”
      

  2.   

    不好意思,我没说清楚;我理解的这个程序是这样的,在没有input.nextLine()的情况下,首先让我输入一个整数,如果我输入一个3.5,则抛出InputMisMatchException异常,导致boolean值没被改变去处理异常,输出again,然后判断boolean值,依然为真,所以进入第二次循环,number重新被申明,应该让我重新输入值,但是这是却一直循环输出“again;”
    按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。
      

  3.   

    不好意思,我没说清楚;我理解的这个程序是这样的,在没有input.nextLine()的情况下,首先让我输入一个整数,如果我输入一个3.5,则抛出InputMisMatchException异常,导致boolean值没被改变去处理异常,输出again,然后判断boolean值,依然为真,所以进入第二次循环,number重新被申明,应该让我重新输入值,但是这是却一直循环输出“again;”
    按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。不好意思,我没说清楚;我理解的这个程序是这样的,在没有input.nextLine()的情况下,首先让我输入一个整数,如果我输入一个3.5,则抛出InputMisMatchException异常,导致boolean值没被改变去处理异常,输出again,然后判断boolean值,依然为真,所以进入第二次循环,number重新被申明,应该让我重新输入值,但是这是却一直循环输出“again;”
    按照你这样说的是没有问题的,而且我做了验证,也是没有问题的,有图有真相。没有出现死循环。
    你是把input.nextLine()去掉后的结果吗?我如果有input.nextLine()和你的结果一样,如果没有就会使这样的:
      

  4.   

    不好意思,我没说清楚;我理解的这个程序是这样的,在没有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)
      

  5.   

    nextLine()执行当前行,并返回跳过的输入信息。 此方法返回当前行的其余部分,不包括结尾处的行分隔符。当前位置移至下一行的行首。 
    因为此方法会继续在输入信息中查找行分隔符,所以如果没有行分隔符,它可能会缓冲所有输入信息,并查找要跳过的行.
      

  6.   


    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 ,置到下一个输入位置)
      

  7.   

    input.nextLine()的作用就是,将 输入流标记位 移动到下一个输入位置。