容器类java

容器类java,java,containers,Java,Containers,我遇到了一个问题,我不知道如何解决它 所以我有三类:第一类是主要的,第二类是书,第三类是书架,里面有一些书 图书班 public class Book { private String title; private int year; private String edition; public Book(String title, int year, String edition) { this.title= title; this.year= year; this.

我遇到了一个问题,我不知道如何解决它

所以我有三类:第一类是主要的,第二类是书,第三类是书架,里面有一些书

图书班

public class Book {
private String title;
private int year;
private String edition;

public Book(String title, int year, String edition) {
    this.title= title;
    this.year= year;
    this.edition = edition;
}

public Book(Book l)
{
    this.title = l.title;
    this.year = l.year;
    this.edition = l.edition;
}
主类

public static void main(String[] args) {


    Book one = new Book("Title1", first, 2014, "Edition1");
    Book two = new Book("Title2", second, 2013, "Edition2");
    Book three= new Book("Title3", third, 2015, "Edition3");
    Book four = new Book("Title4", fourth, 2015, "Edition4");

    Book[] v = new Book[3];
    v[0] = one;
    v[1] = two;
    v[2] = three;


    Shelf shelf= new Shelf();

   try{

    shelf.append(four);
   }(catch myException e)
    {
       System.out.println(e.toString());
    }
货架类

public class Shelf {
private Book[] v;

public Shelf() 
{
    v = new Book[3];
}

public void append (Book x) throws myException
{
   if(x != null && v != null)
   {
    Book[] vAppend = new Book[v.length+1];

    for(int i=0; i<v.length; i++)  
    {
        vAppend[i] = new Book(v[i]);
    }
    vAppend[v.length] = new Book(x);
    v = vAppend;

   }
    throw new myException("Null");
}
公共类工具架{
私人书籍[]v;
公共货架()
{
v=新书[3];
}
公共void append(第十册)抛出myException
{
如果(x!=null&&v!=null)
{
书籍[]vAppend=新书[v.长度+1];

对于(int i=0;i您可以使用如下内容:

public class Shelf {
    private Book[] v;

    public Shelf()
    {
        v = new Book[0];
    }

    public Shelf append (Book x) throws myException
    {
        if(x != null)
        {
            v = Arrays.copyOf(v, v.length + 1);
            v[v.length] = new Book(x);
            return this;
        }
        throw new myException("Null");
    }

问题在您的
工具架
构造函数中

public Shelf()
{
    v = new Book[3];
}
您正在将数组初始化为大小3,但从未在构造函数中填充书籍。因此,一旦执行
new Shelf()
操作,它将有一个大小为3的书籍数组,其中包含3个空值

因此,您得到了一个NPE,因为您的
append(Book x)
方法假定您的Book数组中没有空值

public void append(Book x)
{
    Book[] vAppend = new Book[v.length + 1];

    for (int i = 0; i < v.length; i++)
    {
        // ERROR: v.length is 3 but 
        // v[0], v[1], and v[2] will be null initially!!
        vAppend[i] = new Book(v[i]);
    }
    vAppend[v.length] = new Book(x);
    v = vAppend;
}

目前,每次插入新书时都要进行扩展和复制。这并不是真的必要。最好是有一个初始容量,只有当数组填满时才进行扩展

private static final int INCREMENT = 100;
private int capacity = 0;
private int size = 0;
private Book[] books = {};

public void append(Book book) {
    assert book != null;
    expandIfFull();
    books[size++] = book;
}

private void expandIfFull() {
    assert size <= capacity; 
    if (capacity == size) {
        capacity += INCREMENT;
        Book[] copy = new Book[capacity];
        for (int i = 0; i < size; i++)
            copy[i] = books[i];
        books = copy;
    }
}

顺便说一句,为什么要显式地使用这个
myException
类是没有意义的。如果你要点击一个
NullPointerException
就让它发生吧,不要担心专门编码来抛出你自己的定制NPE。另外,
main
中的
Book
构造函数看起来是错误的…
Book one=new Book(“Title1”,first,2014,“Edition1”);
“first”从何而来?你为什么说你使用的数组是空的?
v
在Shelf的构造函数中初始化。你为什么要将它初始化为大小3?请看
java.util.ArrayList
private static final int INCREMENT = 100;
private int capacity = 0;
private int size = 0;
private Book[] books = {};

public void append(Book book) {
    assert book != null;
    expandIfFull();
    books[size++] = book;
}

private void expandIfFull() {
    assert size <= capacity; 
    if (capacity == size) {
        capacity += INCREMENT;
        Book[] copy = new Book[capacity];
        for (int i = 0; i < size; i++)
            copy[i] = books[i];
        books = copy;
    }
}
public void insert(int index, Book book) {
    assert index < size;
    expandIfFull();
    for (int i = size; i > index; i--)
        books[i] = books[i - 1];
    books[index] = book;
    size++;
}