Java 为什么构造函数数组只存储一个空值?

Java 为什么构造函数数组只存储一个空值?,java,arrays,Java,Arrays,我在计算如何存储构造函数中的对象时遇到了问题。到目前为止,我只得到一个对象,其余的都是空的。如果有人能给我解释一下,让初学者能理解,我将不胜感激 Book catalogue[] = new Book[3]; int select; do { select = bookMenu(); switch(select) { case 1:

我在计算如何存储构造函数中的对象时遇到了问题。到目前为止,我只得到一个对象,其余的都是空的。如果有人能给我解释一下,让初学者能理解,我将不胜感激

        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;
    }
在这里,您在每次添加书籍的调用中都使用
0
初始化
i
。因此,新添加的图书将仅添加在第一个索引上,并被新书覆盖。 因此,全局声明
i
,并在每次成功添加后递增它


您应该将变量名更改为可读的名称,因此我建议您将其更改为
numberOfBooks
currentIndex

我对您的代码做了一些更改,现在就是这样

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

现在让我解释一下我们遗漏了什么。 首先,每次都要重新初始化局部变量“i”,所以将其移出do while循环。 第二,在addBook方法中,您在for循环中迭代了三次,期望用户输入,但没有将这些内容存储在任何地方,并且从addBook方法返回的Book对象仅用于第三次获取的输入。 另外,我在while条件中做了一些更改,以便代码在运行时能够正常工作。
还可以在Book类中实现toString方法,以便在displayBook方法呈现数组时可以看到值。

您的意思是像
publicstaticbook[]addBook()
…欢迎这样做。请参阅如何创建一个。代码不够短,问题解释不够。addBook中的
for
循环只会浪费时间。另外,
addBook
实际上并没有给任何东西添加一本书;更好的名称应该是
createBook
,它更像它的实际功能。将名称从无意义的
i
,更改为有用的名称,例如
numBooks
。全局更改它不会改变anything@KevinAnderson是的,应该这样做。编辑我的答案。:)谢谢,哥们,我查看了代码,根据大家告诉我的,发现了这些错误。再次感谢你的帮助。
case 1:  
    int i =0;
    if(catalogue[i] != null)
    {
        JOptionPane.showMessageDialog(null,"Test");
        break;
    }
    catalogue[i] = addBook();
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);
}
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 + "]";
}