以下Java中的简单代码有点奇怪,我无法理解。
final public class Main
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.print("\nHow many names? ");
int n = sc.nextInt();
String[] a = new String[n];
a[0] = sc.nextLine(); //This line serves no purpose at all. It's useless and should be removed.
for (int i=0; i<n; i++)
{
System.out.print("\nEnter the name:->");
a[i] = sc.nextLine(); //request for input only inside the loop.
}
for (int i=0; i<a.length; i++)
{
System.out.println(a[i]);
}
}
}
以上操作完全没问题,并在控制台上显示输入到阵列 a [] 的名称数量,但当我删除时< strong> a [0] = sc.nextLine(); //这条线根本没用。它没用,应该删除。 ,它首先显示用户数。让我们说3.没有问题但是当循环开始迭代时,它会询问名称并且第一次消息输入名称: - &gt; 显示两次
,输出结果如下所示。
有多少名字? 3
输入名称: - &gt; Don't allow to enter the name here.
输入名称: - &gt; Tiger
输入名称: - &gt; Pitter
虎
去核
虽然我为“多少名字?”输入3,但它只允许输入两个名字。为什么呢?
再次注意上面显示的代码运行良好。只有当上段中使用粗体后缀指定的行被注释掉时才会出现此问题。
答案 0 :(得分:6)
当您使用Scanner.nextInt()
时,它不会消耗新行(或其他分隔符)本身,因此返回的下一个标记通常是空字符串。因此,您需要使用Scanner.nextLine()
来关注它。您可以放弃结果,而不是将结果分配给a[0]
:
int n = sc.nextInt();
sc.nextLine();
出于这个原因,我建议总是使用nextLine
(或BufferedReader.readLine()
)并在使用Integer.parseInt()
后进行解析。
答案 1 :(得分:3)
你正在阅读三行。你遇到的问题是nextInt()读取一个int值,它不会读取并消耗该行的结尾。 (一个常见的错误)
你需要使用nextLine()来表示你想要忽略该行的其余部分。
答案 2 :(得分:1)
nextInt
调用从输入读取直到int的结尾,但是在int之后不读取换行符。因此,第一次迭代显示“输入名称”,然后调用nextLine()
,它读取您键入玩家数量的行的末尾(空字符串)。然后第二次迭代开始并显示“输入名称”,并nextLine()
阻止,直到您键入换行符。