在java中使用while循环和hasNext()进行意外输出

在java中使用while循环和hasNext()进行意外输出,java,while-loop,Java,While Loop,输出: import java.io.*; import java.util.*; public class Solution { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int i=1; while(scan.hasNext()){ System.out.println(i + "

输出:

import java.io.*;
import java.util.*;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int i=1;
        while(scan.hasNext()){
            System.out.println(i + " " + scan.nextLine());
            i++;
        } 
    }
}
问题:当我输入a时,输出是预期的,因为b和c也是一样的。
但我按enter键而不是d键,预期的输出是:“4”,但它不输出4,而是没有输出,当我在按enter键后输入e时,4“空格”和5 e都被打印出来。有人能指出我在这里遗漏了什么吗?

nextLine()扫描器通过当前行并返回跳过的输入,这就是为什么每次输入时都会计数而没有输入,如果您想避免跳过,可以尝试
扫描。next()
这种情况发生是因为您使用的是
nextLine
方法。按Enter键而不输入字符时,
hasNext()
将等待下一个字符。输入e然后按enter键时,
hasNext()
返回。但您现在输入了两行文本:一行为空,另一行为“e”。对
nextLine
的调用返回空行,在循环的下一次运行时,它返回带有“e”的行

为了防止这种情况发生,不要混合使用hasNext和nextLine,请使用hasNext/next或hasNextLine/nextLine。不同之处在于,第一个计算由空格分隔的“单词”,第二个计算行数

a
1 a
b
2 b
c
3 c

e
4 
5 e

我并不是真的按照你输入的东西去看,而是按照你的输出去看。你能更精确地描述这个麻烦的输入吗?好的,我会更精确,我输入了“a”,然后输出是“1A”,这是预期的。然后我输入了“b”,给出了“2B”,然后输入了“c”,给出了“3C”,现在我没有输入任何内容,按了enter,所以我想光标将在循环时通过,并打印“i”的值这是“4”,输入值为零。因此,最终输出必须是“4空格”,但不是输出4,当我在这之后按“e”时,“4空格”“5 e”被打印出来。谢谢你,对编码和stackoverflow很陌生,从来没有想到答案会来得这么快。
    while(scan.hasNextLine()){
        System.out.println(i + " " + scan.nextLine());
        i++;
    }