容器类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++;
}