我得到一个我不知道的例外

时间:2015-02-23 08:37:04

标签: java

我有一个程序可以处理由数组表示的一组圆圈。默认情况下,它的大小为10,但如果添加的项目超过10个,则会将数组扩展10个空格。我找了一个解决方案,以减少集合的长度,以防它的项目数量下降10。我一直在

Exception in thread "main" java.lang.ArrayStoreException: oop.Circle
at oop.ObjectSet.reduce(ObjectSet.java:94)
at oop.ObjectSet.removeObject(ObjectSet.java:39)
at oop.CircleSet.removeObject(CircleSet.java:17)
at oop.Test.main(Test.java:60)

这是来源:

package oop;

public class ObjectSet {
protected Object[] objectSet;
protected int size;

public ObjectSet() {
    objectSet = new Object[10];
    size = 0;
}

public int numberOfItems() {
    return size;
}

public boolean addObject(Object object) {
    if (object != null) {
        if (size == 0)
            objectSet[size] = object;
        if (size == objectSet.length)
            extend();
        if (contains(object) == -1) {
            objectSet[size] = object;
            size++;
            return true;
        }
    }
    return false;
}

public boolean removeObject(Object object) {

    if (object != null && size > 0) {
        int index = contains(object);

        if(size == this.objectSet.length - 10)
            reduce();
        for (int i = index; i < size; i++) {
            objectSet[i] = objectSet[i + 1];
        }
        objectSet[size - 1] = null;
        size--;
        return true;
    }
    return false;

}

public int contains(Object object) {
    if (object != null && size > 0) {
        for (int i = 0; i < size; i++) {
            if (objectSet[i].equals(object))
                return i;
        }
    }
    return -1;
}

public void printSet(){
    if(size > 0){
        for (int i = 0; i < size; i++) {
            System.out.println();
        }
    }
}

private void extend() {
    Object[] temp = new Object[size];

    for (int i = 0; i < size; i++) {
        temp[i] = this.objectSet[i];
    }

    this.objectSet = new Object[size + 10];

    for (int i = 0; i < size; i++) {
        this.objectSet[i] = temp[i];
    }
}

private void reduce(){
    int newSize = this.objectSet.length - 10;
    Object[] temp = new Object[newSize];

    for (int i = 0; i < size; i++) {
        temp[i] = this.objectSet[i]; 
    }

    this.objectSet = new ObjectSet[newSize];

    for (int i = 0; i < size; i++) {
        this.objectSet[i] = temp[i];
    }
}

}

2 个答案:

答案 0 :(得分:0)

有时您将数组初始化为

this.objectSet = new Object[size + 10];

而有时您将其初始化为

this.objectSet = new ObjectSet[newSize];

这可能是异常的原因。

我假设你的意思是后者:

this.objectSet = new Object[newSize];

答案 1 :(得分:0)

您正尝试将Object个实例存储在ObjectSet的数组中。这一行:

this.objectSet = new ObjectSet[newSize];

应该是

this.objectSet = new Object[newSize];

就像在extend方法中一样。

请注意,您还需要将后续循环终止条件更改为i < newSize

相关问题