Java中的System.arraypy出现异常



我在使用这个方法类时遇到了问题。我使用了System.arraypy,但无可否认它是如何100%工作的。我在尝试测试时遇到了这个错误:

Exception in thread "main" java.lang.ArrayStoreException
    at java.lang.System.arraycopy(Native Method)
    at fenn19.GenericStack.push(GenericStack.java:31)
    at fenn19.Test.main(Test.java:8)

第31行:

System.arraycopy(list, 0, o, 0, list.length);

方法类:

public class GenericStack<E> {
    public static int size = 16;
    @SuppressWarnings("unchecked")
    private E[] list = (E[])new Object[size];
  public void add(int index, E e) {
      ensureCapacity();
      for (int i = size - 1; i >= index; i--) {
          list[i + 1] = list[i];
      list[index] = e;
      size++;   
    }
  }
  public int getLength() {
    return list.length;
  }
  public E peek() {
      E o = null;
      for (int i = 0; i > list.length; i++) {
          o = list[i - 1];
    }
      return o;
  }
  public E push(E o) {
        System.arraycopy(list, 0, o, 0, list.length);
        size++;
        return o;
  }
  public E pop() {
      E o = null;
      for (int i = 0; i > list.length; i++) {
          o = list[i - 1];
    }
        list[list.length - 1] = null;
        size--;
        return o;
      }
  private void ensureCapacity() {
      if (size >= list.length) {
        @SuppressWarnings("unchecked")
        E[] newlist = (E[])(new Object[size * 2 + 1]);
          System.arraycopy(list, 0, newlist, 0, size);
          list = newlist;
      }
  }
  public boolean isEmpty() {
      if (list.length < 0) {
        return false;
      }
      else {
          return true;
      }
   }
}

测试类别:

public class Test {
    public static void main(String[] args) {    
    GenericStack<String> est = new GenericStack<String>();
    est.push("Washington DC");
    est.push("Paris");
    est.push("Ottawa");
    est.push("London");
    est.push("Tampa");
    System.out.println(est);
    }
}

如果您查看System.arraycopy的API,您会发现它是一种将数据从一个数组复制到另一个数组的方法。

当您在push方法中调用它时,您将向它提供一个E实例作为目标数组。

但是,在Test类中,您已经创建了一个GenericStack<String>。由于String不是一种类型的数组,因此当您尝试将数据复制到其中时,会出现错误。

push方法中,您真正应该做的是首先检查现有阵列中是否有更多空间。如果是这样,只需添加新元素并增加大小即可。

如果备份阵列已满,请创建一个新的(较大的)阵列,将当前备份阵列复制到其中,然后将元素添加到新阵列中。

最新更新