运行add方法时,我不断收到“线程异常”AWT-EventQueue-0“java.lang.NullPointerException”。
public class SortedListOfImmutables {
private Listable[] items;
/**
* This constructor creates an empty list by creating an internal array
* of size 0. (Note that this is NOT the same thing as setting the internal
* instance variable to null.)
*/
public SortedListOfImmutables() {
items = new Listable[0];
}
/**
* Copy constructor. The current object will become a copy of the
* list that the parameter refers to.
*
* The copy must be made in such a way that future changes to
* either of these two lists will not affect the other. In other words,
* after this constructor runs, adding or removing things from one of
* the lists must not have any effect on the other list.
*
* @param other the list that is to be copied
*/
public SortedListOfImmutables(SortedListOfImmutables other) {
if(other != null) {
items = new Listable[other.items.length];
for(int index=0;index<other.items.length;index++){
items[index] = other.items[index];
}
}
}
/**
* Adds an item to the list. This method assumes that the list is already
* sorted in alphabetical order based on the names of the items in the list.
*
* The new item will be inserted into the list in the appropriate place so
* that the list will remain alphabetized by names.
*
* In order to accommodate the new item, the internal array must be re-sized
* so that it is one unit larger than it was before the call to this method.
*
* @param itemToAdd refers to a Listable item to be added to this list
*/
public void add(Listable itemToAdd) {
if(itemToAdd != null) {
SortedListOfImmutables temp = new SortedListOfImmutables();
temp.items = new Listable[this.items.length+1];
boolean added = false;
if(this.items.length == 0)
temp.items[0] = itemToAdd;
else {
for(int index = 0;index < this.items.length;index++) {
if(this.items[index].getName().compareTo(itemToAdd.getName())>0)
temp.items[index] = items[index];
else {
if(!added) {
temp.items[index] = itemToAdd;
added = true;
}
else temp.items[index+1] = this.items[index];
}
}
}
this.items = new Listable[temp.items.length];
for(int tempIndex = 0;tempIndex < temp.items.length;tempIndex++) {
this.items[tempIndex] = temp.items[tempIndex];
}
}
}
Listable是由Menagerie和Animal类实现的接口,而Menagerie Objects是Animal组。显然,问题是我已经分配了items数组但从未分配了它的元素,所以我应该将this.items [tempIndex]初始化为一个新的Object。但是,它可能是动物或动物园,我不允许使用instanceOf()来找出它是哪一个。此外,Animal Constructor是私有的,因此我不能创建一个新的动物对象。 当我尝试将动物添加到items数组时,它会添加第一个就好了,但是当我尝试添加更多时,它会产生nullpointerexception。我确信解决方案很简单,我只是在思考这个问题。
答案 0 :(得分:1)
如果您使用null
参数调用复制构造函数,则items
将为null
,您将在add
中获得NPE。当arg为null时,要么从复制构造函数中抛出异常,要么在所有情况下初始化items
。
编辑您的代码效率非常低。我建议您使用ArrayList
作为私人items
字段。它为您完成动态调整的所有工作。这样的事情应该有效:
public class SortedListOfImmutables {
private List<Listable> items;
/**
* This constructor creates an empty list.
*/
public SortedListOfImmutables() {
items = new ArrayList<Listable>();
}
/**
* Copy constructor. The current object will become a copy of the
* list that the parameter refers to.
*
* The copy must be made in such a way that future changes to
* either of these two lists will not affect the other. In other words,
* after this constructor runs, adding or removing things from one of
* the lists must not have any effect on the other list.
*
* @param other the list that is to be copied
*/
public SortedListOfImmutables(SortedListOfImmutables other) {
items = (other == null)
? new ArrayList<Listable>()
: new ArrayList<Listable>(other.items);
}
/**
* Adds an item to the list. This method assumes that the list is already
* sorted in alphabetical order based on the names of the items
* in the list.
*
* The new item will be inserted into the list in the appropriate place so
* that the list will remain alphabetized by names.
*
* itemToAdd will not be added if it is null or if it equals an item
* already in the list.
*
* @param itemToAdd refers to a Listable item to be added to this list
*/
public void add(Listable itemToAdd) {
if (itemToAdd != null) {
for (int i = 0; i < items.size(); ++i) {
Listable currentItem = items.get(i);
int comp = itemToAdd.compareTo(currentItem);
if (comp > 0) continue;
if (comp < 0) {
// do this unconditionally if you want to allow duplicates
items.add(i, itemToAdd);
}
return;
}
}
}
}
答案 1 :(得分:1)
显然,问题是我分配了items数组但是 从未分配过它的元素
烨。这肯定是一个可能导致空指针异常的问题;)
问:有一些普通父母的“动物”和“动物园”孩子吗?然而,它可能是动物或动物园,
答案 2 :(得分:0)
将您的代码更改为
public SortedListOfImmutables(SortedListOfImmutables other)
if(other != null) {
items = new Listable[other.items.length];
for(int index=0;index<other.items.length;index++){
items[index] = other.items[index];
}
} else {
items = new Listable[0];
}
}
否则你可以在新对象中创建一个空列表。