Java:ArrayStoreException
我想通过Java:ArrayStoreException,java,arrays,generics,exception,Java,Arrays,Generics,Exception,我想通过E[]toArray(E[]a)用数组队列中的元素填充外部数组,但它在第一个System.arraycopy方法时会抛出ArrayStoreException。我想知道如何解决此问题,更重要的是,我想知道引发此异常的原因。 这是我的密码: public E[] toArray(E[] a) { if(a.length != size) a=(E[])Array.newInstance(a.getClass(), size); if(head<ta
E[]toArray(E[]a)
用数组队列中的元素填充外部数组,但它在第一个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;
}
谢谢您的时间。
a.getClass()
不会返回E
,它将返回一个E数组(因为a是一个数组)。这就是您在赋值时遇到问题的原因。a.getClass()
不会返回E
,它将返回一个E数组(因为a是数组)。这就是您在分配时遇到问题的原因我怀疑异常实际上不会发生在您所指示的行上,但稍后会发生在System.arraycopy
中
问题是,当您只想传入元素类型时,对Array.newInstance
的调用会传入数组类型。换句话说,你说的是“给我一个元素类型为String[]
”的新数组,而你真正想说的是“给我一个元素类型为String
”的新数组”
为此,只需使用getClass().getComponentType()
。如果您删除getComponentType()
,这是一个更简单但完整的问题示例:
import java.lang.reflect.*;
公开课考试{
公共静态void main(字符串[]args){
字符串[]原始=新字符串[]{“x”};
字符串[]x=测试到阵列(原始);
}
公共静态E[]toArray(E[]a){
E[]copy=(E[])Array.newInstance(a.getClass().getComponentType(),a.length+1);
System.arraycopy(a,0,copy,0,a.length);
返回副本;
}
}
我怀疑异常实际上不会发生在您指示的行上,但稍后会发生在System.arraycopy
中
问题是,当您只想传入元素类型时,对Array.newInstance
的调用会传入数组类型。换句话说,你说的是“给我一个元素类型为String[]
”的新数组,而你真正想说的是“给我一个元素类型为String
”的新数组”
为此,只需使用getClass().getComponentType()
。如果您删除getComponentType()
,这是一个更简单但完整的问题示例:
import java.lang.reflect.*;
公开课考试{
公共静态void main(字符串[]args){
字符串[]原始=新字符串[]{“x”};
字符串[]x=测试到阵列(原始);
}
公共静态E[]toArray(E[]a){
E[]copy=(E[])Array.newInstance(a.getClass().getComponentType(),a.length+1);
System.arraycopy(a,0,copy,0,a.length);
返回副本;
}
}
您可以展示一个演示该问题的示例吗?(这是一个泛型类型吗?我想是的…)你让我们复制的越简单,它就越容易帮助你。(事实上,我怀疑我知道这个问题-只是现在检查一下…)对不起,但我不知道我应该提供什么额外的信息来解决这个问题。我的ArrayQueue是通用的,它有一个包含元素的字段E[]elementData
。elementData
的基本类型是Object
,它在constructor中铸造为(E[])
额外的信息将是一个简短但完整的示例-我们可以复制、粘贴、编译并运行它来查看问题。您能展示一个演示该问题的示例吗?(这是一个泛型类型吗?我想是的…)你让我们复制的越简单,它就越容易帮助你。(事实上,我怀疑我知道这个问题-只是现在检查一下…)对不起,但我不知道我应该提供什么额外的信息来解决这个问题。我的ArrayQueue是通用的,它有一个包含元素的字段E[]elementData
。elementData
的基本类型是Object
,它在constructor中铸造为(E[])
额外的信息将是一个简短但完整的示例-我们可以复制、粘贴、编译并运行它来查看问题。
String[] words = q.toArray(new String[2]);
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;
}
}