我有一个任务是创建自己的动态数组而不使用任何ArrayList
或其他预先制作的java类数组。
我尝试添加对象时遇到Exception in thread "main" java.lang.NullPointerException
错误(例如它的整数)。
Dinaminis<Integer> array = new Dinaminis<>();
array.ideti(5);
我的Dinaminis课程看起来像这样:
public class Dinaminis<T> implements DArray<T>
{
private Object[] array;
private int kiek;
private Object[] temp;
public Dinaminis() {
array = new Object[10];
kiek = 0;
}
@Override
public void ideti(Object o) {
if (array.length == kiek) {
temp = new Object[kiek*2];
}
for (int i=1; i < kiek; i++){
temp[i] = array[i];
}
array = temp;
array[kiek] = o;
kiek++;
}
}
事情是我想要使用&#34; ideti&#34;方法,我想检查数组是否已满,如果它已满,它应该创建一个双倍大小的数组。但是,即使在我的阵列已满之前,我也会收到错误。
答案 0 :(得分:3)
你的ideti方法错了。这应该有效:
public void ideti(Object o) {
if (array.length == kiek) {
temp = new Object[kiek*2];
// only copy old array to new array when old one is full
for (int i=0; i < kiek; i++){ // index starts at 0, not 1
temp[i] = array[i];
}
array = temp;
}
array[kiek] = o;
kiek++;
}
您的问题是,即使原始数组未满,也会执行将旧数组复制到新数组的循环,在这种情况下temp
未初始化,这导致NullPointerException
。
答案 1 :(得分:1)
我建议您将array
存储为您的通用类型T
。我会传递给Class<T>
到Dinaminis
构造函数,然后您可以使用Array.newInstance()
。另外,我更喜欢使用System.arraycopy()
并覆盖toString()
,例如
public class Dinaminis<T> implements DArray<T> {
private T[] array;
private int kiek;
private Class<T> cls;
public Dinaminis(Class<T> cls) {
this.cls = cls;
array = (T[]) Array.newInstance(cls, 10);
kiek = 0;
}
@Override
public void ideti(T o) {
if (kiek == array.length) {
T[] temp = (T[]) Array.newInstance(cls, array.length * 2);
System.arraycopy(array, 0, temp, 0, array.length);
array = temp;
}
array[kiek++] = o;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(String.format("len = %d [", array.length));
for (int i = 0; i < kiek; i++) {
if (i != 0) {
sb.append(", ");
}
sb.append(array[i]);
}
sb.append("]");
return sb.toString();
}
}
然后你可以用
之类的东西来测试它public static void main(String[] args) {
DArray<Integer> t = new Dinaminis<Integer>(Integer.class);
for (int i = 0; i < 11; i++) {
t.ideti(i);
}
System.out.println(t);
}
输出
len = 20 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
显然,出于教学原因,len
被添加到此输出中,并且在实际代码中我可能无法显示它(除了可能在日志消息中)。
答案 2 :(得分:0)
您需要在使用之前初始化临时数组。
您在 if 内进行初始化,但不在之外
temp = new Object [kiek * 2];
因此,只有在数组大小完成时才会分配双倍大小的数组
if (array.length == kiek) //check if array size is reached
{
temp = new Object[kiek*2]; //allocate a double sized array
for (int i=1; i < kiek; i++) //copy elements - are you sure you don't want to start with i=0? You won't copy the first element if you start at 1
{
temp[i] = array[i];
}
array = temp;
}