请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

测试的时候报了一个ArrayStoreException错误

错误内容是
Exception in thread “main” java.lang.ArrayStoreException: java.lang.Integer
at Array.Array.add(Array.java:52)
at Array.Array.addLast(Array.java:37)
at Array.Main.main(Main.java:9)

public static void main(String[] args) {
        Array<Integer> arr = new Array<Integer>(20);
        for(int i = 0 ; i < 10; i++){
            arr.addLast(i);
        }
        System.out.println(arr);
    }
public void addLast(E e){
        add(size,e);
    }
 public void add(int i,E e){
        if(size == data.length){
            throw new IllegalArgumentException("AddLast failed.Array is full.");
        }
        for(int j=size-1;j>=i;j--){
            data[j]=data[j-1];
        }
        data[i] = e;
        size++;
    }//i没判断。

最初怀疑是int没有自动装箱,但JDK版本确实是1.8
而且,添加了手动装箱的代码后报同样错误。
没辙了。
请老师同学们帮我看看……

下面是完整代码
Array类

private E[] data;
    private int size;

    public Array(int capacity){
        data = (E[])new Object[capacity];
        size = 0;
    }

    public Array(){
        this(10);
    }

    public int getSize(){
        return size;
    }

    public int getCapacity(){
        return data.length;
    }

    public boolean isEmpty(){
        return  size == 0;
    }

    public void addLast(E e){
        add(size,e);
    }

    public void addFirst(E e){
        add(0,e);

    }

    public void add(int i,E e){
        if(size == data.length){
            throw new IllegalArgumentException("AddLast failed.Array is full.");
        }
        for(int j=size-1;j>=i;j--){
            data[j]=data[j-1];
        }
        data[i] = e;
        size++;
    }//i的元素没判断。

    @Override
    public String toString(){
        StringBuilder res = new StringBuilder();
        res.append(String.format("Array: size = %d , capacity = %d\n",size,data.length));
        res.append('[');
        for(int i = 0 ; i < size ;i ++){
            res.append(data[i]);
            if(i != size - 1){
                res.append(",");
            }
        }
        res.append(']');
        return res.toString();
    }
    //获取数组元素
    E get(int index){
        if(index < 0 || index >= size)
            throw new IllegalArgumentException("Get failed.Index is illegal.");

        return data[index];
    }
    //修改数组元素
    void set(int index,E e){
        if(index < 0 || index >= size)
            throw new IllegalArgumentException("Get failed.Index is illegal.");
        data[index] = e;
    }


    //查找数组中是否有元素e;
    public boolean contains(E e){
        for (int i = 0;i < size ; i++){
            if(data[i].equals(e))
                return true;
        }
        return false;
    }
    //找不到返回-1
    public int find(E e){
        for(int i = 0 ; i < size ; i++){
            if(data[i].equals(e)){
                return i;
            }
        }
        return -1;
    }
    //找到全部的元素e
    public Array findAll(E e){
        Array a = new Array();
        for(int i = 0;i < size ;i++){
            if (data[i] == e) {
              a.addLast(i);
            }
        }
        return a;

    }
    //删除指定序号的元素
    public E del(int index){
        E ret = data[index];
        for(int i = index;i < size ; i++){
            data[i]=data[i+1];
        }
        size--;
        data[size]=null;
        return ret;
    }

    public void delFirst(int e) {
        del(1);

    }

    public void delLast(int e) {
        del(size-1);
    }

    //删除指定元素e
    public void removeElement(E e){
        int index = find(e);
        if(index!=-1){
            del(index);

        }
        index = find(e);
        if(index ==  -1){
            System.out.println("元素"+e+"已被删除。");
        }else{
            System.out.println("好像还有别的"+e+"没有被删除。");
        }

    }
    //删除全部是e的元素。
    public void removeAllElement(E e){
        while(find(e)!=-1){
        removeElement(e);
        }
    }

Main类

public class Main {
    public static void main(String[] args) {
        Array<Integer> arr = new Array<Integer>(20);
        for(int i = 0 ; i < 10; i++){
            arr.addLast(i);
        }
        System.out.println(arr);

        arr.add(3,3);
        System.out.println(arr);

        arr.removeAllElement(3);
        System.out.println(arr);

    }
}

正在回答

3回答

我也出现这个错误了,

原因是,在构造函数中定义 data[] 时,类型指定错误,

应该为 Object 类型。

https://img1.sycdn.imooc.com//szimg/5fabae8609edf56007460654.jpg


1 回复 有任何疑惑可以回复我~
  • 提问者 阿萨斯qqq #1
    !!!天哪,困扰我好几周的错误!
    谢谢小天使!呜呜呜太感动了
    回复 有任何疑惑可以回复我~ 2020-11-11 20:58:43
liuyubobobo 2020-10-26 12:05:36

至少 add 中有错误,应该是:data[j + 1]=data[j];


单步跟踪一下你的 main 函数中的 arr.add(3,3); 这句调用,按照你的写法会发生什么?为什么是错误的?进步就发生在这个过程中哦。

0 回复 有任何疑惑可以回复我~
  • 提问者 阿萨斯qqq #1
    老师!我终于找到错了,我导入包导错了!感谢楼上同学
    回复 有任何疑惑可以回复我~ 2020-11-11 20:59:30
liuyubobobo 2020-10-25 04:45:58

请提供一下完整的,直接可以运行复现你的错误的代码。

0 回复 有任何疑惑可以回复我~
  • 提问者 阿萨斯qqq #1
    好的!
    回复 有任何疑惑可以回复我~ 2020-10-25 11:30:14
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信