при преобразовании объекта[] в строку[] я получаю java.lang.Исключение ArrayStoreException для следующего кода

#java #spring-boot #csv

Вопрос:

 public void createCSV(Map<String, Object> map) {
   String  reportPath =  "C:/Users/nandini/Desktop/file.csv";

    try {
        FileWriter fileWriter = new FileWriter(reportPath);
        CSVWriter csvWriter = new CSVWriter(fileWriter,
                CSVWriter.DEFAULT_SEPARATOR,
                CSVWriter.NO_QUOTE_CHARACTER,
                CSVWriter.DEFAULT_ESCAPE_CHARACTER,
                CSVWriter.DEFAULT_LINE_END);


        String[] header = map.keySet().toArray(new String[map.size()]);
        


        Object[] data = map.values().toArray(new Object[map.size()]);
        String[] stringArray = Arrays.copyOf(data, data.length, String[].class);

        // adding data to csv
        csvWriter.writeNext(header);
        csvWriter.writeNext(stringArray);            
        csvWriter.close();
    } catch (Exception e) {
        logger.error(e);

    }
}
 

Комментарии:

1. Не каждый ценный объект был а String . Вы не можете предполагать иного. Вы должны протестировать или использовать String.valueOf() .

Ответ №1:

Это происходит из-за следующей строки:

 String[] stringArray = Arrays.copyOf(data, data.length, String[].class);
 

Метод Javadoc утверждает, что метод выдает, ArrayStoreException если элемент, скопированный из оригинала, не относится к типу среды выполнения, который может быть сохранен в массиве класса newType.

Поэтому , если Object[] массив содержит элемент, который не является элементом a String , это исключение будет выдано. Вместо приведения элемента к a String , вы можете получить его строковое представление с помощью toString() метода:

 String[] stringArray = Arrays.stream(data)
                             .map(Object::toString)
                             .toArray(size -> new String[size]);
 

Редактировать:

Без потоков…

 String[] stringArray = new String[data.length];
for (int i = 0; i < data.length; i  ) {
    stringArray[i] = data[i].toString();
}
 

Комментарии:

1. не могли бы вы, пожалуйста, рассказать мне, как писать на java1.7

2. @nandini Просто сделайте простой цикл над Object[] массивом и назначьте каждому объекту toString() String[] массив. Я рекомендую вам попробовать написать его самостоятельно, так будет намного лучше 🙂