用户输入的名称

时间:2017-05-28 02:13:56

标签: java while-loop java.util.scanner

我试图创建一个程序,询问用户库中的书籍数量。然后它会询问那些书名并将它们存储在一个数组中。问题是,当程序要求提供库中书籍的数量时,该程序只询问一次名称。

我有一种感觉,问题是在while循环内,扫描仪搞砸了,但我不确定。

import java.util.Scanner;

public class LIBBOOKS {

    public static void main(String[] args)
    {
        int numB = 0;
        int count = 0;;
        boolean libEmpty = true;
        String nameArray[];
        String bookName = "";

        System.out.println("Enter Number of Books: ");
        Scanner value = new Scanner(System.in);     
        numB = value.nextInt();

        nameArray = new String[numB];

        while(libEmpty)
        {
            Scanner sValue = new Scanner(System.in);
            System.out.println("Enter Book Name: ");
            while(sValue.hasNextLine())
            {
                bookName = sValue.nextLine();
            }

            count++;
            nameArray[count] = bookName;
            if(numB < count)
            {
                System.out.println("Capacity Reached");
                libEmpty = false;
            }
            sValue.close();
        } 

        value.close();
        System.out.println("Book Listing Entered:");
        for(int i = 1; i > count; i++)
        {
            System.out.println(" " + nameArray[i]);
        }

    }

}

当我运行程序时,这就是我得到的:

Enter Number of Books: 
4
Enter Book Name: 
apples
corn
peaches
oranges

在我有机会输入另一个名字之前,程序应该每次询问我这个名字是什么。 我期待发生的事情:

Enter Number of Books:
4
Enter Book Name:
apples
Enter Book Name:
corn
Enter Book Name:
peaches
Enter Book Name:
oranges

Capacity Reached
Book Listing Entered:
corn apples peaches oranges

2 个答案:

答案 0 :(得分:2)

只需剪切这一行:

System.out.println("Enter Book Name: ");

将其粘贴到您输入图书名称的循环中:

while(sValue.hasNextLine())
  {
     System.out.println("Enter Book Name: ");
     bookName = sValue.nextLine();
  }

答案 1 :(得分:2)

此代码存在一些问题。您创建多个扫描仪。他们没有必要,虽然他们可能不会伤害你,但你应该创建一个:

Scanner scanner = new Scanner(System.in);

您的类名称不适合Java命名约定,即使用类名称的混合大小写。我稍后会提到一些其他的小风格问题。

但是,最大的两个问题是,在您阅读了书籍数量之后,您不会清除尾随换行符,并且您在没有对它们做任何事情的情况下紧紧地阅读书籍名称。

当您使用scanner.nextInt()时,即使您输入了整行,扫描仪也会读取一个数字,并在数字到达该数字的末尾时立即停止。

假设您输入4并按Enter键。缓冲区中包含以下字符:4 \n

扫描仪只读取4,将其转换为int并将其返回。下次拨打scanner.nextLine()时,它会看到\n并返回一个空行。这意味着您需要在尝试阅读书名之前清除该换行符。您可以通过拨打scanner.nextLine()来完成此操作。

如果您的其他错误没有,那么您会问我们为什么第一本书的名称会出现空白。现在,关于那个其他错误。

System.out.println("Enter Book Name: ");
while (scanner.hasNextLine())
{
    bookName = scanner.nextLine();
}

这段代码的作用是读取一行,扔掉它,读取另一行,扔掉它,等等。这将结束的唯一方法是,如果它击中了文件的末尾,因为你从终端读取而不是文件,或者你按Ctrl-C杀死了JVM。

你继续阅读书名,但你不能对它们做任何事情。而你的问题是你希望每次都能得到提示,但提示不在循环中。你想做的是这样的:

scanner.nextLine(); // clear the newline after the number of books
while (count < numB)
{
    System.out.println("Enter Book Name:");
    bookName = scanner.nextLine();
    nameArray[count] = bookName;
    count++;
}

除此之外,bookName变量甚至没有理由存在。它只用于取名,然后将其放入数组中。您也可以直接读入数组:

scanner.nextLine(); // clear the newline after the number of books
while (count < numB)
{
    System.out.println("Enter Book Name:");
    nameArray[count] = scanner.nextLine();
    count++;
}

现在,在您阅读完这些书之后,还有一个错误,但是关于扫描仪的第一个小问题。这不会伤害你,但它并不是真的正确:

scanner.close();

您不想关闭此扫描仪。关闭文件是一个很好的习惯,但是有一个原则可以让你何时关闭某些东西,就是这样:你应该关闭你打开的任何东西,但只关闭你打开的东西。

你没有打开System.in。你只是在它周围包裹了一个Scanner。因为你没有打开它,你不想关闭它。由于关闭终端并没有真正做任何事情,这里没有任何危害,但要做到这一点并不严格。

另一方面,如果您打开了FileInputStream并在周围包裹了Scanner ,那么您肯定要关闭扫描仪以便你打开的文件会正常关闭。

好的,现在打印出来的书!

for (int i = 1; i > count; i++)
{
    System.out.println(" " + nameArray[i]);
}

这里有两个不同的问题。首先,你的循环条件是错误的。您希望从0开始,并在i 小于 nameArray.length时继续。 (countnumB应该与nameArray.length具有相同的值,但是数组知道它有多长,所以你应该依赖它而不是一个可能恰好具有相同的变量值。)以下是正确的for循环的样子:

for (int i = 0; i < nameArray.length; i++)
{
    System.out.println(" " + nameArray[i]);
}

然而,自Java 5以来,有一种更好的方法:增强型For循环:

for (String bookName : nameArray)
{
    System.out.println(" " + bookName);
}

这样,就没有让数组索引错误的危险。

最后一点:命名很难,你选择的名字没有错,但我会调用数组books和书名{{1所以我会编写最后一个循环:

title