我试图创建一个程序,询问用户库中的书籍数量。然后它会询问那些书名并将它们存储在一个数组中。问题是,当程序要求提供库中书籍的数量时,该程序只询问一次名称。
我有一种感觉,问题是在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
答案 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
时继续。 (count
和numB
应该与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