Неожиданное исключение ArrayStoreException - PullRequest
1 голос
/ 24 июня 2009

Почему следующий код выдает 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);

Ответы [ 4 ]

11 голосов
/ 24 июня 2009

Из документов на System.arraycopy:

В противном случае, если любое из следующего true, исключение ArrayStoreException и пункт назначения не изменяется:

[...]

Аргумент src и аргумент dest ссылаются на массивы, чьи типы компонентов разные примитивные типы.

Это именно тот случай, когда int и double - это разные примитивные типы, поэтому исключение выдается, как описано.

Смысл arraycopy заключается в том, что он может работать ослепительно быстро, слепо копируя необработанные данные, без применения каких-либо преобразований. В вашем случае должен будет применить преобразования, поэтому он потерпит неудачу.

3 голосов
/ 24 июня 2009

Да, это задокументированное поведение для arraycopy между массивами с различными примитивными типами в качестве компонентов. Вопрос о том, может ли тип обычно повышаться, не имеет значения; это то, для чего предназначен arraycopy.

0 голосов
/ 24 июня 2009

Нет автоматического преобразования между int и двойными элементами в массиве с помощью arraycopy (). Нативный метод проверяет эквивалентность типа массива и выдает исключение ArrayStoreException. Вам придется вернуться к простой или метод цикла:

for (int i = 0; i < a.length(); i++)
    a[i] = b[i];
0 голосов
/ 24 июня 2009

попробуйте дважды ** [] ** a = {2.0,3.4,3.6,2.7,5.6}; а также int ** [] ** b

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...