2015-10-08 4 views
1

Я пытаюсь перебрать набор информации, которую я имею в электронной таблице, моя таблица имеет три столбца и две строки.Вызвано: java.util.NoSuchElementException - Использование итератора в Java?

Это мой код, я использую перебрать информации,

private List<DataRecord> allData = new ArrayList<>(); 

public DataRepository(String excelFilePath) { 

    FileInputStream inputStream; 
    try { 
     inputStream = new FileInputStream(new File(excelFilePath)); 

     Workbook workbook = new XSSFWorkbook(inputStream); 
     Sheet firstSheet = workbook.getSheetAt(0); 
     Iterator<Row> iterator = firstSheet.iterator(); 

     while (iterator.hasNext()) { 
      DataRecord record = new DataRecord(); 

      Row nextRow = iterator.next(); 
      Iterator<Cell> cellIterator = nextRow.cellIterator(); 
      while (cellIterator.hasNext()) { 
       record.setCardNumber(cellIterator.next().getStringCellValue()); 
       record.setCvv(cellIterator.next().getStringCellValue()); 
       record.setPostcode(cellIterator.next().getStringCellValue()); 

      } 

      allData.add(record); 
     } 

     inputStream.close(); 
    } catch (IOException e) { 

     e.printStackTrace(); 
    } 
} 

public List<DataRecord> getAllData() { 
    return allData; 

} 

public void setAllData(List<DataRecord> allData) { 
    this.allData = allData; 
} 

Это сработало сегодня утром, и теперь, кажется, бросить выше исключение, и я не уверен, почему.

Благодаря

Это полные трассировки стеки

Caused by: java.util.NoSuchElementException: null 
at java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1205) 
at java.util.TreeMap$ValueIterator.next(TreeMap.java:1252) 
at gov.uk.dwp.epayments.repository.DataRepository.<init>(DataRepository.java:43) 
at gov.uk.dwp.epayments.service.PayService.<init>(PayService.java:11) 
at gov.uk.dwp.epayments.controller.PaymentController.<init>(PaymentController.java:23) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:422) 
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147) 
... 18 common frames omitted 
+0

Пожалуйста, поделитесь полной StackTrace. – hotzst

+1

Возможно, у вас есть лишнее или отсутствующее значение столбца, которое отбрасывает цикл. Проверьте данные файла excel. –

+0

Включите источники POI в рабочее пространство, чтобы отладить то, что именно происходит в итераторе. – Stroboskop

ответ

1

Этот блок кода не очень хорошо сделан, и вызывает вызов следующие(), прежде чем быть уверенными, если есть следующая ячейка

Iterator<Cell> cellIterator = nextRow.cellIterator(); 
while (cellIterator.hasNext()) { 
    record.setCardNumber(cellIterator.next().getStringCellValue()); 
    record.setCvv(cellIterator.next().getStringCellValue()); 
    record.setPostcode(cellIterator.next().getStringCellValue()); 
} 

Вы проверяете один раз, если у него есть следующий предмет, но трижды увеличиваются. (три следующие экземпляры)

Если у вас не больше, чем дерево ячеек в строке можно использовать таким образом (его только один из множества возможных решений):

Iterator<Cell> cellIterator = nextRow.cellIterator(); 
if(cellIterator.hasNext(){ 
    record.setCardNumber(cellIterator.next().getStringCellValue()); 
} 
if(cellIterator.hasNext(){ 
    record.setCvv(cellIterator.next().getStringCellValue()); 
} 
if(cellIterator.hasNext(){ 
    record.setPostcode(cellIterator.next().getStringCellValue()); 
} 
+0

Теперь мой код работает, я получаю сообщение об ошибке Не могу получить текстовое значение из числовой ячейки. Мои переменные определяются как строки, а мои ячейки в excel форматируются как текст. Есть идеи по этому вопросу? –

Смежные вопросы