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 + "]";
}