一个不起作用的简单Java代码

时间:2011-11-07 22:03:39

标签: java

以下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,但它只允许输入两个名字。为什么呢?


再次注意上面显示的代码运行良好。只有当上段中使用粗体后缀指定的行被注释掉时才会出现此问题。

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()阻止,直到您键入换行符。