代码之家  ›  专栏  ›  技术社区  ›  Andrei0408

尝试向对象数组添加元素时出现NullPointerException

  •  0
  • Andrei0408  · 技术社区  · 4 年前

    我是一个java新手,我知道如何用C语言编程,所以当我试图编码时,我主要考虑用C语言。我想创建一个方法,允许我通过Book类型的数组将书籍添加到集合中。

    class Set{
        private int maxElements;
        public static int countElements = 0;
        public Book arr[];
    
        public Set(int maxElements)
        {
            this.maxElements = maxElements;
        }
    
        public boolean addBook(Book b, Book[] arr)
        {
           
            countElements++;
            
            if(countElements > maxElements)
                return false;
            
            for(int i = 0; i < countElements; i++)
            {
                if(this.arr[i].equals(b) && this.arr[i] != null)
                    return false;
            }
            
            arr[countElements - 1] = new Book(b.getTitle(), b.getAuthor());
            countElements++;
            return true;
        }
    
        public void printSet(Book arr[])
        {
            for(int i = 0; i < arr.length; i++)
            {
                System.out.println("Book ["+i+"] : "+arr[i].getTitle()+" | Author : "+arr[i].getAuthor());
            }
        }
    
        public String toString()
        {
            String res = null;
            for(int i = 0; i < arr.length; i++)
            {
                res = "Book ["+i+"] : "+arr[i].getTitle()+" | Author : "+arr[i].getAuthor();
            }
            return res;
        }
    
        public int getMaxElements()
        {
            return maxElements;
        }
    
    }
    

    Set类的主要方法是:

    public class SetClient {
        public static void main(String[] args) {
            Set s = new Set(2);
           int size = s.getMaxElements();
    
            Book b1 = new Book("1984", "George Orwell");
            Book b2 = new Book("Hamlet", "William Shakespeare");
            Book[] arr = new Book[size];
            
            s.addBook(b1, arr);
            s.addBook(b2, arr);
    
            if(s.addBook(b1, arr) == true)
            {
                System.out.println("Added new book to the set: "+b1.getTitle());
            }
            else
            {
                System.out.println("Book NOT added.");
            }
    
            if(s.addBook(b2, arr) == true)
            {
                System.out.println("Added new book to the set: "+b2.getTitle());
            }
            else
            {
                System.out.println("Book NOT added.");
            }
    
            System.out.println(s);
        }
        
    }
    
    

    class Book{
        private int pages;
        private String title, author;
    
        public Book(int pages)
        {
            this.pages = pages;
        }
    
        public Book(String title, String author)
        {
            this.title = title;
            this.author = author;
        }
    
        public boolean equals(Object book)
        {
            if(book instanceof Book)
            {
                return ((Book)book).pages == this.pages && ((Book)book).title.equals(this.title);
            }
            return false;
        }
    
        public boolean equalsTitle(Object book)
        {
            if(book instanceof Book)
            {
                return ((Book)book).title == this.title;
            }
            return false;
        }
    
        public String toString()
        {
            return "This book has: "+pages+" pages";
        }
    
        public String getTitle()
        {
            return title;
        }
    
        public String getAuthor()
        {
            return author;
        }
    }
    

    NullPointerException when Creating an Array of objects 已经,但我仍然无法解决我的问题,我似乎不知道如何在我的案例中使用它。程序的输出是

    Exception in thread "main" java.lang.NullPointerException: Cannot load from object array because "this.arr" is null
            at Set.addBook(Set.java:21)
            at SetClient.main(SetClient.java:10)
    

    我应该换什么?

    2 回复  |  直到 4 年前
        1
  •  1
  •   rzwitserloot    4 年前

    public Book arr[];

    它可以编译,但这不是合适的样式。写:

    public Book[] arr;
    

    private

    if(this.arr[i].equals(b)

    你的 arr 变量是指针。您尚未初始化它,因此这意味着它不指向任何内容。因此 arr[i] 将抛出NullPointerException。比核心转储更好,这是你在C中得到的。

    全部的 Book[] arr; 指向指向书本对象的指针数组的指针。

    arr = new Book[10];
    

    指向数组。这是一系列的书 指针 ,执行此操作时,所有这些值都为NULL。你还没有10本书。如果你想要10本书,你需要展示如何去读 new Book(); 至少调用了10次,或者您可能还没有10本书。

    this.arr[i].equals(b) 将会崩溃。 . this.arr[i]. 当指针指向插槽时,将抛出NPE i 通过跟随指针找到的数组的 this.arr

    this.arr[i] == null

    if(s.addBook(b1, arr) == true)

    只要写 if (s.addBook(b1, arr)) . == true X == true X 如果 X X . 而不是 X == false !X ,不管X是什么。

    集合的书本数组与main的书本数组

    Set类有一个Book[]类型的字段,名为arr。 你从不使用这个字段 . 相反,你也有,完全与集合无关 Book[] arr ,在主方法中创建一个book数组,并将其传递。这毫无意义。是哪一个?这两个集合都应该有book数组,或者main数组应该有。如果Set有它,那么您不需要传递它(所有非静态方法都只知道类中的所有字段,所以您只需引用 在这些方法中。

    java ese设置了Book数组,java是面向对象的,与C不同:在java中,代码和代码操作的数据结构在单个源文件中“结合在一起”。

    Book[] arr

    刚出现的 数组,然后更新指针以指向新指针(如果愿意)。这让他们在这项工作上很糟糕,大概是你的 Set 应该能够生长和收缩。A. List<Book> books = new ArrayList<Book>(); 在这里似乎更合适。

    数组,尤其是非原语的数组,是低级构造,除非您编写低级驱动程序/实用程序(例如,为 ArrayList int[] ).

        2
  •  0
  •   Mohammad Shetewi    4 年前

    首先,应该在set类中初始化arr

    this.arr = new Book[size];
    

    由于arr是一个对象数组,那么它应该有一个已经初始化的Books类型的对象。