【问题标题】:Trouble with object array对象数组的问题
【发布时间】:2014-10-01 02:05:05
【问题描述】:

当我尝试运行此方法时出现空指针异常,目标是填充 booklist 对象数组,但不超过 3 个对象。当我设置 booklist[0] = b

时发生错误
private Book [] booklist;
public boolean borrowBook(Book b)
{
    if(booklist == null)
    {
        booklist[0] = b;
        System.out.println(this.name+" has successfully borrowed "+b);
        return true;
    }
    if(booklist.length < 3)
    {
        booklist[booklist.length] = b;
        System.out.println(this.name+" has successfully borrowed "+b);
        return true;
    }
    System.out.println(this.name+" has reached the borrowing limit! Return those books "+this.name);
    return false;

【问题讨论】:

  • 你需要初始化booklist
  • 我对对象数组不太了解,我可以初始化它并让我的 borrowBook 方法按原样工作吗?
  • 当然如果booklist == null你不能访问booklist[0]
  • 对象的默认数据类型为空
  • 那么我会用什么代替 booklist[0] = b

标签: java arrays object


【解决方案1】:

您需要ArrayList 而不是array

ArrayList<Book> booklist = new ArrayList<Book>();

public boolean borrowBook(Book b){
    if(booklist.size() == 0){
        booklist.add(b);
        System.out.println(this.name+" has successfully borrowed "+b);
        return true;
    }
    if(booklist.size() < 3){ //I'm not sure what you are trying to achieve here
        booklist.add(booklist.size(), b);
        System.out.println(this.name+" has successfully borrowed "+b);
        return true;
    }

    System.out.println(this.name+" has reached the borrowing limit! Return those books "+this.name);
    return false;
}

【讨论】:

    【解决方案2】:

    试试这个。

    private Book [] booklist;
    
    public boolean borrowBook(Book b) {
        if (booklist == null) {
            booklist = new Book[3];
            booklist[0] = b;
            return true;
        }
        for (int i = 0; i < booklist.length; i++) {
            if (booklist[i] == null) {
                booklist[i] = b;
                return true;
            }
        }
        return false;
    }
    
    public static void main(String[] args) {
        Book caller = new Book();
        System.out.println(caller.borrowBook(new Book()));
        System.out.println(caller.borrowBook(new Book()));
        System.out.println(caller.borrowBook(new Book()));
        System.out.println(caller.borrowBook(new Book()));
    }
    

    【讨论】:

    • 谢谢! , 其他答案都很好,但是我的老师希望我在这个项目中只使用一个普通的数组。谢谢大家,谢谢wittakarn
    【解决方案3】:

    同样,@August 说。 行前booklist[0] = b;

    您必须使用 booklist = new Book[3]; 进行初始化

    【讨论】:

    • 我的方法在不让它将超过 3 本书存储到这个数组中时仍然有效吗?
    • 我如何检查书单中有多少非空对象。通过将其初始化为长度 3 ,if(booklist.length &lt; 3) 将不起作用。我可以用什么方法检查
    • 我发布我的新答案,你可以娱乐。祝你好运。
    【解决方案4】:

    Java 数组不是动态调整大小的,可以编写一个方法来做到这一点。例如,

    private static Book[] addBook(Book[] arr, Book b) {
        int newLen = (arr == null ? 1 : arr.length + 1);
        Book[] dest = new Book[newLen];
        System.arraycopy(arr, 0, dest, 0, arr == null ? 0 : arr.length);
        dest[newLen - 1] = b;
        return dest;
    }
    

    然后你可以用它来做类似的事情

    public boolean borrowBook(Book b) {
        if (booklist == null || booklist.length < 3) {
            booklist = addBook(booklist, b);
            System.out.println(this.name + " has successfully borrowed " + b);
            return true;
        }
        System.out.println(this.name + " has reached the borrowing limit! "
                + "Return those books " + this.name);
        return false;
    }
    

    或者,您可以只分配大小为n 的数组或使用ArrayList 之类的集合。

    【讨论】:

      【解决方案5】:

      初始化booklist 将修复NullPointerException,但您的方法的逻辑仍然存在缺陷。您似乎想追加一本新书到已签出的书籍数组中,而您的方法只会设置数组中的最后一个元素。

      要解决此问题,您可以使用一个计数器来存储最后插入的图书的索引。或者,我建议使用ArrayList 等可增长数组,它支持使用ArrayList#add 追加新元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2011-06-21
        • 2012-05-15
        • 2021-07-19
        • 2021-04-21
        • 1970-01-01
        相关资源
        最近更新 更多