2017-05-28 217 views
-1

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

我有一种感觉,问题是在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

你能否把预期的产出呢? – Mritunjay

+0

看来你可以使用一些免费的[调试技巧](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) –

回答

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); 
} 

这样,没有得到数组索引错误的危险。

最后一点:命名很难,你选择的名字没有问题,但我会打电话给bookstitle这本书的名字,所以我会写下最后一个循环:

for (String title : books) { 
    System.out.println(" " + title); 
} 
+1

我正在输入一个提到这些的答案。但你拿走了。这比试图发布的内容更好。好打@DavidC – Blasanka

2

只需剪切此行:

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

,并粘贴在循环中,你输入书名:

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

你需要先消费号码后的号码 –

+0

你还需要*做*与书名的东西。这将读取一堆书名,只保留最后一个。 –

相关问题