Узнайте, почему возникает исключение ArrayStoreException при работе с массивами в Java, а также как определить основную причину и исправить эту ошибку.
1. Основная причина ArrayStoreException
Массивы Java являются ковариантными и поддерживают правила подтипирования Java, массив типа T[] может содержать элементы типа T или любого подтипа T. Например, Integer является подтипом Number, поэтому мы можем присвоить значение Integer массиву Number.
Number[] numbers = new Number[3];numbers[0] = new Integer(10); // Works Fine.
Java также позволяет массиву S[] быть подтипом массива T[], если S является подтипом T.
Integer[] intArray = { 1, 2, 3, 4 };Number[] numArray = intArray;numArray[0] = 10; // Works Fine.
Теперь представьте, что мы пытаемся обмануть компилятор и сохранить число с плавающей точкой в приведенном выше массиве.
numArray[0] = 10.01;
Приведенный выше код завершится ошибкой и выдаст ошибку java.lang.ArrayStoreException: java.lang.Double во время выполнения. Несмотря на то, что 10.01 — это число, среда выполнения Java четко знает, что Number[] numArray — это всего лишь ссылочная переменная, а фактический массив имеет тип Integer[]. Поэтому среда выполнения Java разрешит только значения Integer в массиве.
Итак, первопричина ArrayStoreException — попытка сохранить несовместимый тип значения в массиве. Проверка типа может быть обманута во время компиляции, возможно, неосознанно, но среда выполнения Java поймает эту попытку и выдаст ArrayStoreException.
2. Решение
2.1. Анализировать и исправлять вручную
- Как только мы узнаем об ошибке, мы сможем легко ее решить. Нам нужно внимательно проверить код в строке, где исключение было зарегистрировано в журналах приложения. Как только мы исправим тип данных значения и сохраним значение совместимого типа в массиве, исключение будет устранено.
- По какой-то причине, если у нас нет контроля над значениями, передаваемыми в массив, другим вариантом является использование try-catch для блокировки такого кода и принятия соответствующих мер в случае обнаружения несовместимого типа значения.
2.2. Дополнительная проверка типа
Другой вариант — дополнительная проверка типа перед добавлением элемента в массив. Если элемент имеет несовместимый тип, то пусть массив его сохранит; в противном случае отклоните значение с помощью удобного обработчика ошибок.
Integer[] intArray = { 1, 2, 3, 4 };double value = 10.01;if(intArray.getClass().getComponentType()==((Object)value).getClass()) {numArray[0] = value;} else {System.out.println("Incompatible type");}
3. Заключение
В этом коротком уроке мы узнали, почему мы получаем ArrayStoreException в Java и как мы можем исправить эту проблему. Хотя ручное исправление кода является правильным решением, все равно дополнительная проверка типов сделает код более надежным.