Java:ArrayStoreException

时间:2016-03-12 21:40:45

标签: java arrays generics exception

我希望通过E[] toArray(E[] a)使用我的ArrayQueue的元素填充外部数组,但不知怎的,它会在第一个ArrayStoreException方法中抛出System.arraycopy。我想知道如何解决这个问题,对我来说更重要的是要知道为什么抛出这个异常。

这是我的代码:

public E[] toArray(E[] a)
{
    if(a.length != size) 
        a=(E[])Array.newInstance(a.getClass(), size); 
    if(head<tail)
        System.arraycopy(elementData, head, a, 0, tail-head); // ArrayStoreException
    else
    {
        System.arraycopy(elementData, head, a, 0, capacity-head);
        System.arraycopy(elementData, 0, a, capacity-head, tail);
    }
    return a;           
}

这是外部方法:

String[] words = q.toArray(new String[2]);

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

我怀疑异常并非实际在您指明的行上发生,但稍后会在System.arraycopy中发生。

问题是,当您只想传入元素类型时,您对Array.newInstance的调用会传入数组类型。换句话说,你说'#34;给我一个元素类型为String[]&#34;的新数组。你真正想说的地方#34;给我一个元素类型为String&#34;的新数组。

为此,请使用getClass().getComponentType()。演示是一个更简单但完整的问题示例,如果您删除getComponentType()

import java.lang.reflect.*;

public class Test {

    public static void main(String[] args) {
        String[] original = new String[] { "x" };
        String[] x =  Test.<String>toArray(original);
    }

    public static <E> E[] toArray(E[] a) {
        E[] copy = (E[]) Array.newInstance(a.getClass().getComponentType(), a.length + 1);
        System.arraycopy(a, 0, copy, 0, a.length);
        return copy;
    }
}

答案 1 :(得分:1)

a.getClass()不会返回E,它会返回一个数组(因为a是一个数组)。这就是你在分配时遇到问题的原因