2016-04-25 48 views
1

我知道這個網站對像我這樣的新手來說可能相當苛刻,但我已經嘗試了三天才得到這個權利。這是最終項目的作業分配的一部分。我遇到的問題是當我多次使用案例1時,第一次按計劃運行,但第二次似乎忽略了以下幾行。全球掃描儀工作一次,但在第二次運行時會有點毛茸茸

System.out.println("Please enter the title: "); 
     String title = two.nextLine(); 

,我注重的區域是在add()方法,並在主類的書店類,案例1.當嘗試添加第二本書,代碼立即跳到過去書名並直接前往ISBN。

import java.util.Scanner; 
public class MIS_Tester { 
public static Scanner two = new Scanner(System.in); 
public static Scanner three = new Scanner(System.in); 
    public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); 
     Bookstore bookseller = new Bookstore(); 
     Order addBook = new Order(); 
     Sale sell = new Sale(); 
     boolean finished = false; 
     while(!finished){ 
      System.out.println("Select: (0) output; (1) add book; (2) delete book; (3) order book;" 
        + "(4) sell a book; (5) exit"); 
      int option = in.nextInt(); 
      switch(option){ 
      case 0: bookseller.ouput();break; 
      case 1: bookseller.add(two);break; 
      case 2: bookseller.delete(two);break; 
      case 3: addBook.add(three);break; 
      case 4: sell.sellBook(two);break; 
      default: finished = true; break; 
      } 
     } 
     in.close(); 
    } 
} 

class Bookstore{ 
    private Book[] catalog; 
    private int numBooks; 
    private final int MAXBOOKNUM = 100; 
    Scanner nine = new Scanner(System.in); 

    public Bookstore(){ 
     numBooks = 0; 
     catalog = new Book[MAXBOOKNUM]; 
    } 
    public void ouput(){ 
     for (int i = 0; i < numBooks; i++) catalog[i].output(); 
    } 
    public void add(Scanner two){ 
     System.out.println("Please enter the title: "); 
     String title = two.nextLine(); 
     System.out.println("Enter the ISBN: "); 
     int isbn = two.nextInt(); 
     System.out.println("Enter the publication date: "); 
     int month = two.nextInt();int day = two.nextInt();int year = two.nextInt(); 
     catalog[numBooks++] = new Book(title, isbn, new Date(month, day, year)); 
    } 
    public void delete(Scanner two){ 
     System.out.println("enter the one to delete"); 
     int option = two.nextInt(); 
     int numOfElements = catalog.length - (option +1); 
     System.arraycopy(catalog, option + 1, catalog, option, numOfElements); 
    } 
} 

class Book{ 
    private String title; 
    private Date pubDate; 
    private int isbn; 
    private int orderNumber; 

    public Book(String title, int isbn, Date pubDate){ 
     this.title = title; 
     this.isbn = isbn; 
     this.pubDate = pubDate; 
    } 

    public Book(String title, int isbn, Date pubDate, int orderNumber){ 
     this.title = title; 
     this.isbn = isbn; 
     this.pubDate = pubDate; 
     this.orderNumber = orderNumber; 
    } 
    public void output(){ 
     System.out.println("Title: " + "\"" +title + "\""); 
     System.out.println("ISBN: " + isbn); 
     pubDate.output(); 
    } 
    public void orderOut(){ 
     System.out.println("The book " + "\"" + title + "\"" + " has been ordered."); 
    } 
} 

控制檯登錄:

Select: (0) output; (1) add book; (2) delete book; (3) order book;(4) sell a book; (5) exit 
1 
Please enter the title: 
All About Dogs 
Enter the ISBN: 
1234 
Enter the publication date: 
12 
29 
1978 
Select: (0) output; (1) add book; (2) delete book; (3) order book;(4) sell a book; (5) exit 
1 
Please enter the title: 
Enter the ISBN: 
+1

你爲什麼要創建如此多的'Scanner'實例? –

+2

除了@ElliottFrisch的問題,你還可以在你的main方法中調用'in.close()',這會關閉stdin,這將使stdin上的其他掃描器無法工作。在stdin上合併爲單個掃描器,並且不要關閉它。 – KevinO

+0

@ElliottFrisch,我瞭解您對多個Scanner實例的關注。我發佈的所有代碼都非常難看,因爲熟悉java的任何人的標準和我正在努力改進。我非常感謝你們在這裏給予的幫助,我現在已經回到Eclipse來實施你們所提到的修復和建議。 – PoundingHead

回答

1

所以在位於here.

nextLine()的Java API的 - 此掃描器執行當前行,並返回跳過的輸入信息。

因此,此方法將掃描儀推進到新行並返回跳過的輸入。

nextInt() - 將輸入的下一個標記掃描爲int。

此方法僅將輸入的下一個標記作爲int獲取。它不會消耗換行符。

所以基本上所發生的事情是:

當您使用System.out.println但讓他們留在輸入緩衝器nextInt()方法沒有使用換行符令牌您正在創建新行。所以當你第二次調用nextLine()時,它只會返回輸入緩衝區中下一個的換行符(這是剩餘的)。我希望這是有道理的,讓我知道我是否應該詳細說明。

解決方法: - 添加two.nextLine() //after each call to two.nextInt()

所以更新的add()方法是這樣的:

public void add(Scanner two){ 
    System.out.println("Please enter the title: "); 
    String title = two.nextLine(); 
    System.out.println("Enter the ISBN: "); 
    int isbn = two.nextInt(); 
    two.nextLine(); // consume the left over newline token in the buffer 
    System.out.println("Enter the publication date: "); 
    int month = two.nextInt();int day = two.nextInt();int year = two.nextInt(); 
    two.nextLine(); // consume the left over newline token in the buffer 
    catalog[numBooks++] = new Book(title, isbn, new Date(month, day, year)); 
} 

注意此代碼並沒有進行測試。

+0

非常感謝您的幫助。它像冠軍一樣工作,但你已經知道了。再次感謝,也許現在我可以將我的用戶名從PoundingHead更改爲更令人愉快的東西。 – PoundingHead

+0

哈哈真棒聽到它的工作!你能否接受我的回答,以便看到這個的其他人知道我提供的信息是有效的?謝謝! – sebenalern

相關問題