2017-05-24 1 views
-1

コンストラクタからオブジェクトを保存する方法を理解するのに問題があります。これまで私が得るのは1つのオブジェクトで残りはすべてnullです。誰かが私にそれを説明することができれば、初心者がそれが大いに評価されることを理解できるようになります。なぜコンストラクタ配列は1つを除いてnull値を格納しますか?

 Book catalogue[] = new Book[3]; 

     int select; 
     do 
     { 
      select = bookMenu(); 
      switch(select) 
      { 
      case 1: 
       int i =0; 
       if(catalogue[i] != null) 
       { 
        JOptionPane.showMessageDialog(null,"Test"); 
        break; 
       } 
       catalogue[i] = addBook(); 
      case 2:  
       sortBook();  
      break; 
      case 3:  
       searchBook(catalogue); 
      break; 
      case 4:  
       displayBook(catalogue); 
      break; 
      case 5: 
      break; 
      } 
     } 
     while(select != 5); 
    } 
    public static int bookMenu() 
    { 
     int select; 
     String menuOptions = "--Book store--\n" 
       + "\n1. Add book to catalogue" 
       + "\n2.Sort and display books by price" 
       + "\n3. Search for a book by title" 
       + "\n4. Display all books" 
       + "\n\n5. Exit"; 
     do 
     { 
      select = Integer.parseInt(JOptionPane.showInputDialog(menuOptions)); 
     } 
     while(select < 1 || select > 5); 
     return select; 
    } 
    public static Book addBook() 
    { 
     int isbn; 
     String title, author; 
     Book catalogue = null; 
     double price; 
     for(int i=0; i<3;i++) 
     { 
      isbn = Integer.parseInt(JOptionPane.showInputDialog 
           ("Enter Book ISBN or: ")); 
      title = JOptionPane.showInputDialog 
           ("Enter Book Title: "); 
      author = JOptionPane.showInputDialog 
           ("Enter Book Author: "); 
      price = Double.parseDouble(JOptionPane.showInputDialog 
           ("Enter Book Price: "));  
      catalogue = new Book(isbn, title, author, price);  
     } 
     return catalogue; 
    } 

は、表示方法は最初の最後のオブジェクトが表示されますし、他のすべては、あなたが本を追加するためのすべての呼び出しで0iを初期化している。ここ

public static void displayBook(Book catalogue[])//remain void 
{ 
    String output = ""; 
    for(Book bk:catalogue) 
    { 
    output += bk + "\n"; 
    }   
    JOptionPane.showMessageDialog(null, output); 
} 
+0

あなたは 'public static Book [] addBook()' ...のようなものを意味しましたか... – vikingsteve

+2

ようこそ。 [mcve]の作成方法をご覧ください。コードは短くはなく、問題は十分に説明できません。 – AxelH

+0

'addBook'の' for'ループは時間を無駄にします。また、 'addBook'は実際に何かに本を追加しません。より良い名前は 'createBook'でしょう。これは実際にはもっとよく似ています。 –

答えて

1
case 1: 
    int i =0; 
    if(catalogue[i] != null) 
    { 
     JOptionPane.showMessageDialog(null,"Test"); 
     break; 
    } 
    catalogue[i] = addBook(); 

nullです。新しく追加された本は最初の索引にのみ追加され、新しい本で上書きされます。 iをグローバルに宣言し、追加が成功するたびにインクリメントします。

可変名を読みやすい名前に変更する必要がありますので、numberOfBooksまたはcurrentIndexに変更することをお勧めします。

+0

名前を無意味な 'i'から' numBooks'のような有用なものに変更してください。 –

+0

それをグローバルに変更しても何も変わらない – Zeph

+0

@SanketMakaniあなたの伝説の男の子の問題は解決されました – Zeph

0

私はここにあなたのコード内のいくつかの変更を行っているが、それは今

public class Test { 
public static void main(String args[]) { 

    Book[] catalogue = new Book[3]; 
    int i = 0; 
    int select = 0; 
    select = bookMenu(); 
    do { 
     if (i == 3) { 
      JOptionPane.showMessageDialog(null, "Books added successfully"); 
      select = bookMenu(); 
     } 
     switch (select) { 
     case 1: 
      catalogue[i++] = addBook(); 
      break; 
     case 2: 
      sortBook(); 
      break; 
     case 3: 
      searchBook(catalogue); 
      break; 
     case 4: 
      displayBook(catalogue); 
      break; 
     default: 
      break; 
     } 
    } while (select != 5 || i != 3); 
} 

public static int bookMenu() { 
    int select; 
    String menuOptions = "--Book store--\n" + "\n1. Add book to catalogue" + "\n2.Sort and display books by price" 
      + "\n3. Search for a book by title" + "\n4. Display all books" + "\n\n5. Exit"; 
    do { 
     select = Integer.parseInt(JOptionPane.showInputDialog(menuOptions)); 
    } while (select < 1 || select > 5); 
    return select; 
} 

public static Book addBook() { 
    int isbn; 
    String title, author; 
    double price; 
    isbn = Integer.parseInt(JOptionPane.showInputDialog("Enter Book ISBN or: ")); 
    title = JOptionPane.showInputDialog("Enter Book Title: "); 
    author = JOptionPane.showInputDialog("Enter Book Author: "); 
    price = Double.parseDouble(JOptionPane.showInputDialog("Enter Book Price: ")); 
    return new Book(isbn, title, author, price); 
} 

public static void sortBook() { 

} 

public static void searchBook(Book catalogue[])// remain void 
{ 
    String searchValue = JOptionPane.showInputDialog("Enter the title of the book you are searching for"); 
    boolean found = true; 
    for (int i = 0; i < catalogue.length && catalogue[i] != null; i++) { 
     if (searchValue.equalsIgnoreCase(catalogue[i].getTitle())) { 
      JOptionPane.showMessageDialog(null, "Book details: " + catalogue[i].toString()); 
      found = true; 
     } 
    } 
    if (found == false) { 
     JOptionPane.showMessageDialog(null, "The title does not exist in the collection "); 
    } 
} 

public static void displayBook(Book[] catalogue)// remain void 
{ 
    String output = ""; 
    for (Book bk : catalogue) { 
     output += bk + "\n"; 
    } 
    JOptionPane.showMessageDialog(null, output); 
} 

}

そして、ここであなたのBook.javaが

public class Book { 
private int isbn; 
private String author; 
private String title; 
private double price; 

/** 
* 
*/ 
public Book(int isbn, String author, String title, double price) { 
    this.isbn = isbn; 
    this.author = author; 
    this.title = title; 
    this.price = price; 
} 

public String getTitle() { 
    return title; 
} 

@Override 
public String toString() { 
    return "Book [isbn=" + isbn + ", author=" + author + ", title=" + title + ", price=" + price + "]"; 
} 

}

である方法です私たちがここで欠けていたものを説明しましょう。 まず、ローカル変数 "i"は毎回再初期化されていたので、do whileループの外側に移動しました。 2番目のaddBookメソッドでは、ユーザーからの入力を期待していたがどこでもそれらのものを保存せず、bookオブジェクトがaddBookメソッドから3番目にフェッチされた入力に対してのみ返されていたforループを3回反復していました時間。 私はあなたのwhile条件でいくつかの変更を行ったので、コードを実行すると正しく動作します。 また、BookBookのtoStringメソッドを実装して、displayBookメソッドが配列をレンダリングするときに値を確認できるようにします。

+0

ありがとう、おい、私はコードを見てみんなが私に言っていることに基づいてこれらのエラーを発見した。あなたのご親切に感謝します。 – Zeph

関連する問題