2009-06-24 46 views
1

为什么下面的代码会抛出ArrayStoreException意外的ArrayStoreException

double[] a = {2.0,3.4,3.6,2.7,5.6}; 
int[] b = {2,3,4,5}; 
System.arraycopy(b,0,a,1,4); 
+8

如果你声称你的代码抛出异常,那么你至少应该发布编译的代码。 – 2009-06-24 13:59:12

回答

11

从文档为System.arraycopy

否则,如果下面的是 真,则抛出ArrayStoreException异常 和目的地不被修改:

[...]

src参数和dest参数 指到其组件类型为 是不同基本类型的数组。

这正是这里的情况 - intdouble是不同的原始类型,从而证明抛出异常。

arraycopy的要点在于,它可以通过盲目复制原始数据而快速工作,而无需应用任何转换。在你的情况下,它必须应用转换,所以它失败。

0

尝试双** [] ** a = {2.0,3.4,3.6,2.7,5.6}; 和 int ** [] ** b

3

是的,这是在具有不同基元类型的数组作为组件的arraycopy中记录的行为。这种类型是否可以正常推广并不相关;这是arraycopy的设计目的。

0

数组中的int和double元素与arraycopy()之间没有自动转换。本地方法检查数组类型等价性并抛出ArrayStoreException不匹配。你必须回复到循环的平原或方法:

for (int i = 0; i < a.length(); i++) 
    a[i] = b[i];