Почему атрибуты объектов из моего списка ArrayList возвращают значение null?

#java #class #oop

Вопрос:

Я пишу код для библиотеки (книг) на Java. У меня есть класс книг с тремя атрибутами: Название, Автор и Жанр. Жанр хранится как an int , потому что их не так много:

 public class Book {
  public  String title;
  
  public  String author;

  public  int genre;
  
  public Book() {
    this.title = title;
    this.author = author;
    this.genre = genre;
  }
  public void setBookTitle(String newBookTitle) {
    this.title = newBookTitle;
  }
  public void setBookAuthor(String newBookAuthor) {
    this.author = newBookAuthor;
  }
  public void setBookGenre(int newBookGenre) {
    this.genre = newBookGenre;
  }

  public String getBookTitle() {
    return  title;
  }
  public String getBookAuthor() {
    return author;
  }
  public int getBookGenre() {
    return genre;
  }
  public String toString() {
    LibraryDatabase libraryDatabase = new LibraryDatabase();
    
    return ("Title: " this.getBookTitle()  
            "Author: "  this.getBookAuthor() "Genre: "   this.getBookGenre() //edit this part to refer the integer to a String
            );
  }

  
}
 

У меня есть библиотечный класс базы данных для хранения массива книг:

 
    import java.util.*;
    
    public class LibraryDatabase extends Book {
    ArrayList<Book> bookDatabase;
      public LibraryDatabase() {
       
      }
      public void books() {
        Book book1 = new Book();
    
        book1.setBookTitle("Harry Potter");
        book1.setBookAuthor("J.K. Rowling");
        book1.setBookGenre(1);
      }
    
      public ArrayList<Book> getArrayList() {
        return bookDatabase;
      }
      
    }

 

Наконец, у меня есть класс клиентов, который в основном просто организует все вышеперечисленное в удобный интерфейс:

 import java.io.*;
import java.util.*;

public class Customer {
  
  public Customer() {
  }

  public void run() {
    System.out.print("Welcome to Generic Library Service. Please enter your name.");
    Scanner kbEater = new Scanner(System.in);
    String customerName = kbEater.nextLine();
    System.out.println("Would you like to borrow, return, or donate a book?");
    System.out.println("    1. Borrow");
    System.out.println("    2. Return");
    System.out.println("    3. Donate");
    Scanner kbNeeder = new Scanner(System.in);
    int customerChoice = kbEater.nextInt();
    switch (customerChoice) {
      case 1: borrow();
      break;
      //case 2: returnBook();
      //case 3: donate();
    }
  }
  public void printGenres() {
    
    System.out.println("    1. Fantasy");
    System.out.println("    2. Science Fiction");
    System.out.println("    3. Dystopian");
    System.out.println("    4. Action amp; Adventure");
    System.out.println("    5. Mystery");
    System.out.println("    6. Horror");
    System.out.println("    7. Thriller amp; Suspense");
    System.out.println("    8. Historical Fiction");
    System.out.println("    9. Romance");
    System.out.println("    10. Graphic Novel");
    System.out.println("    11. Young Adult");
    System.out.println("    12. Children's");
    System.out.println("    13. Memoir amp; Biography");
    System.out.println("    14. Food");
    System.out.println("    15. Art amp; Photography");
    System.out.println("    16. Self-improvement");
    System.out.println("    17. History");
    System.out.println("    18. Travel");
    System.out.println("    19. Humor");
    System.out.println("    20. How-to");
    System.out.println("    21. Science amp; Tech");
  }
  
  public void borrow() {
    System.out.println("What is the genre of the book you're looking for?");
    printGenres();
    Scanner kbMeter = new Scanner(System.in);
    int genre = kbMeter.nextInt();
    System.out.println("Do you want to see titles, or are you looking for a particular author?");
    System.out.println("    1. Titles now");
    System.out.println("    2. Search by author");
    Scanner kbLeader = new Scanner(System.in);
    int titleOrSearch = kbLeader.nextInt();
    switch(titleOrSearch) {
      case 1:
      titlesNow();
      break;
      case 2:
      //method for searching by author
    }

  }
  public void titlesNow() {
    LibraryDatabase libraryDatabase = new LibraryDatabase("1", "1", 2);
    System.out.println(toString());

  }
  
}
 

И это результат:

 Welcome to Generic Library Service. Please enter your name. **Username**
Here are our books:
Title: nullAuthor: nullGenre: 0
 

Почему это происходит? Почему атрибуты возвращают значение null? Я хочу перечислить названия, авторов и жанры всех книг из списка книг. Поскольку в настоящее время существует только одна книга, она должна распечатать эту книгу («Гарри Поттер» Джоан Роулинг).

Комментарии:

1. В books , вы создаете new Book , устанавливаете некоторые из его значений… затем функция заканчивается, и вы выбрасываете эту книгу.

2. Сначала книгу нужно добавить в список массивов, прежде чем вы сможете просмотреть ее и получить доступ к полям.

Ответ №1:

Ваша проблема здесь, в конструкторе:

 public Book() {
  this.title = title;
  this.author = author;
  this.genre = genre;
}
 

Вы присваиваете title, author, genre себе то, что есть все null . Чтобы исправить это, просто передайте некоторые параметры конструктору:

 public Book(String title, String author, int genre) {
  this.title = title;
  this.author = author;
  this.genre = genre;
}
 

и все должно работать вместо того, чтобы использовать методы сеттера.

Неправильная печать происходит из-за того, что вы нигде не сохраняете свои book1 данные. В вашем конструкторе для LibraryDatabase добавьте bookDatabase = new ArrayList<>(); и в конце books() функции добавьте a bookDatabase.add(book1); .

Кроме того, обратите внимание, что ваш LibraryDatabase метод ничего не делает в вашем toString() методе.

Комментарии:

1. Это приводит к ошибке в классе LibraryDatabase, запрашивающем параметры при вызове объекта Book.

2. Вы также должны добавить параметры в конструктор, а не только new Book(title, author, genre); . Таким образом, у вас будет правильный конструктор, соответствующий тому, который вы вызвали.

3. Существует множество экземпляров базы данных книг и библиотек, вызываемых в программе как объекты. Нужно ли мне вставлять параметры во все это? И что именно я вставляю, просто фальшивые строки и вставки?

4. Ну, в вашем примере вы бы вставили «Гарри Поттера»… И т. Д. То, что предлагает @null_awe, заменяет использование ваших сеттеров, поэтому, когда вы создаете свою книгу, вы вводите название и т. Д. Вы могли бы просто избавиться от кода в своем конструкторе, но было бы гораздо разумнее сделать это там.

5. Ладно, я все это сделал. Это все еще печатается не так, как я хочу, возвращаясь: Customer@214c265e

Ответ №2:

Измените базу данных библиотеки, как показано ниже

     import java.util.*;
    
    public class LibraryDatabase extends Book {
    ArrayList<Book> bookDatabase;
      public LibraryDatabase() {
       
      }
      public void books() {
        Book book1 = new Book();
    
        book1.setBookTitle("Harry Potter");
        book1.setBookAuthor("J.K. Rowling");
        book1.setBookGenre(1);
        bookDatabase.add(book1);
      }
    
      public ArrayList<Book> getArrayList() {
        return bookDatabase;
      }
      
    }
 

Добавьте это в свой список объектов. book1 Также добавьте код @null_awe. этого тебе тоже не хватает .

    public Book(String title,String author,int genre) {
    this.title = title;
    this.author = author;
    this.genre = genre;
  }