代码似乎跳过了第一个"Next.Line(("然后直接进入第二个。以下是它运行时会发生的情况。感谢
import java.util.*;
public class PrintWriter {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scn = new Scanner(System.in);
System.out.println("Would you like to enter some names?");
String response = scn.next();
int namecount = 1;
String name;
if (response.equals("yes") || response.equals("Yes") || response.equals("Yes"))
{
System.out.println("How many names would you like to enter?");
for (int nameresponse = scn.nextInt(); namecount <= nameresponse; ++namecount)
{
System.out.println("Please enter the name of name #" + namecount );
name = scn.nextLine();
}
}
}
}
nextLine()
完全按照它的javadoc所说的去做,这不是你认为它会做的。扫描仪的最佳用途如下:
- 从不调用
nextLine
-只调用所有其他方法(next()
、nextInt()
等( - 只调用
nextLine
,不调用所有其他方法
显然,考虑到读取整数有时很好,第一个选择是上级。
对于键盘输入,也就是扫描仪通常使用的功能,最好的使用方法是将其设置为实际执行大多数人认为的操作——输入由用户输入,用户通过点击回车键完成任何输入。
为此,在new Scanner
之后立即写入:
scanner.useDelimiter("\R");
这是java ese的意思:";输入由换行符"定界;并且可以在任何平台上工作。现在,要读取整数,请运行.nextInt()
。要读取文本,请运行.next()
(读取整行的值(。幸运的是,没有办法读懂"一个词"——这个词很少出现。好处:避免了nextLine
和所有其他next
方法之间的奇怪交互,用户现在可以输入空白输入(如果用户只点击回车键,.next()
将返回一个空字符串,而如果在默认配置中使用scanner,则根本不起作用(。
但为什么呢
scanner通过扫描分隔符并返回分隔符之间的内容来"标记"输入。开箱即用,分隔符配置为"1个或多个空白符号"。这意味着next()
将读取一个单词,也意味着不可能读取零长度输入(因为只需点击回车键就是添加越来越多的空白,您只需继续键入更多相同的分隔符(。两者都不方便,因此,我们不希望这样。
每当您"消费"一个令牌时(任何next()
方法都会这样做(,"光标"现在位于令牌的末尾和后面的分隔符的开头:如果用户输入了一个名称,然后点击回车键,则我们在回车键的开始,就在它之前。
然后调用nextLine()
,这是一个完全不同的功能,它完全忽略了这种"标记"one_answers"分隔符"业务,只返回所有内容,直到换行符为止。假设下一个符号是换行符,则返回一个空字符串。
一个非常常见但很糟糕的解决方案是,在每次调用任何非nextLinenext
方法后,只调用scanner.nextLine()
,忽略结果。然而,如果你这样做,当用户按下键盘上最大的键——空格键时,一切都会进入手板。所以不要这样做,打电话给.useDelimiter("\R")
,忘记.nextLine()
。
您需要使用scn.nextLine((而不是scn.next…next只读取一个单词,直到出现空格并终止到下一步,而nextLine则考虑完整的一行。