在Java中,next()和nextLine()是用于从输入流中读取数据的方法,在处理用户输入时常见使用。
next():
- next()方法用于获取输入流中的下一个字符串(以 空白字符 作为分隔符),并返回该字符串。
- 它只会返回输入中的下一个字符串,忽略字符串之后的空白字符 (这也是导致问题的原因)。
- next()方法返回的结果不包含空白字符。
例如:
Scanner scanner = new Scanner(System.in);
System.out.print("请输入两个字符串:");
String str1 = scanner.next();
String str2 = scanner.next();
System.out.println("第一个字符串:" + str1);
System.out.println("第二个字符串:" + str2);
输入:
Hello World
输出:
第一个字符串:Hello
第二个字符串:World
//还残留一个 空白字符(World之后的) 在缓冲区
nextLine():
- nextLine()方法用于获取输入流中的下一行字符串,并返回该字符串。
- 它获取的是输入流中的一整行,包括 空白字符 在内的所有字符。
- nextLine()方法返回的结果包含整行的内容,直到遇到回车符(Enter键)为止 (回车也会被读取掉)。
例如:
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一行字符串:");
String line = scanner.nextLine();
System.out.println("输入的字符串为:" + line);
输入:
Hello World
输出:
输入的字符串为:Hello World
//回车也被读取掉了
问题 : 如果在代码中混用next()和nextLine()可能会产生问题,原因是它们的输入缓冲区操作不同
举个例子:
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个整数:");
int num = scanner.nextInt();// 和next一样
System.out.print("请输入一行字符串:");
String line = scanner.nextLine();
System.out.println("输入的整数为:" + num);
System.out.println("输入的字符串为:" + line);
输入:
10
输出:
输入的整数为:10
输入的字符串为:
上述代码中,nextLine()方法没有等待用户输入字符串,直接返回了一个空字符串。这是因为在执行完nextInt()后,输入流中的换行符('\n')仍然留在输入缓冲区中(忽略 == 跳过,所以导致最后一个空白字符会残留在缓冲区中),然后nextLine()方法会读取缓冲区中的这个换行符作为输入。
解决该问题的一个方法是在nextInt()后使用一个额外的nextLine(),将输入缓冲区中的换行符读取掉。
修改后的代码如下:
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个整数:");
int num = scanner.nextInt();
scanner.nextLine(); // 读取输入缓冲区中的换行符
System.out.print("请输入一行字符串:");
String line = scanner.nextLine();
System.out.println("输入的整数为:" + num);
System.out.println("输入的字符串为:" + line);
输入:
10
// \n 被额外的nextLine()读取掉了
123
输出:
输入的整数为:10
输入的字符串为:123
浙公网安备 33010602011771号