【问题标题】:Java: ArrayStoreExceptionJava:数组存储异常
【发布时间】:2016-03-12 21:40:44
【问题描述】:

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

这是我的代码:

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]);

感谢您的宝贵时间。

【问题讨论】:

  • 你能用minimal reproducible example 来证明这个问题吗? (这是泛型类型吗?我假设是这样的......)您使我们重现的越简单,就越容易为您提供帮助。
  • (实际上,我怀疑我知道问题所在——现在才检查......)
  • 对不起,但我不知道我应该提供什么额外信息来解决这个问题。我的 ArrayQueue 是通用的,它有一个包含元素的字段 E[] elementDataelementData的底层类型为Object,在构造函数中被强制转换为(E[])
  • 额外信息将是一个简短但完整的示例 - 我们可以复制、粘贴、编译和运行以查看问题。

标签: java arrays generics exception


【解决方案1】:

我怀疑异常实际上不会发生在您指定的行上,而是稍后发生在System.arraycopy

问题是你对Array.newInstance 的调用传入了数组类型,而你只想传入元素类型。换句话说,你说的是“给我一个元素类型为 String[] 的新数组”,而你真正想说的是“给我一个元素类型为 String 的新数组”。

为此,只需使用getClass().getComponentType()。 Demo 这是一个更简单但完整的问题示例,如果你删除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;
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 2018-09-23
      • 2020-12-05
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多