Java ArrayStoreException и как его устранить?

Узнайте, почему возникает исключение 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. Анализировать и исправлять вручную

  1. Как только мы узнаем об ошибке, мы сможем легко ее решить. Нам нужно внимательно проверить код в строке, где исключение было зарегистрировано в журналах приложения. Как только мы исправим тип данных значения и сохраним значение совместимого типа в массиве, исключение будет устранено.
  2. По какой-то причине, если у нас нет контроля над значениями, передаваемыми в массив, другим вариантом является использование 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 и как мы можем исправить эту проблему. Хотя ручное исправление кода является правильным решением, все равно дополнительная проверка типов сделает код более надежным.

Прокрутить вверх