我有一个程序可以处理由数组表示的一组圆圈。默认情况下,它的大小为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];
}
}
}
答案 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
。