Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
原因:java.util.NoSuchElementException-在java中使用迭代器?_Java_Exception_Iterator - Fatal编程技术网

原因:java.util.NoSuchElementException-在java中使用迭代器?

原因:java.util.NoSuchElementException-在java中使用迭代器?,java,exception,iterator,Java,Exception,Iterator,我试图在电子表格中迭代一组信息,我的电子表格有三列和两行 这是我用来迭代信息的代码 private List<DataRecord> allData = new ArrayList<>(); public DataRepository(String excelFilePath) { FileInputStream inputStream; try { inputStream = new FileInputStream(new File(

我试图在电子表格中迭代一组信息,我的电子表格有三列和两行

这是我用来迭代信息的代码

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;
}
private List allData=new ArrayList();
公共数据存储库(字符串excelFilePath){
文件输入流输入流;
试一试{
inputStream=新文件inputStream(新文件(excelFilePath));
工作簿=新XSSF工作簿(inputStream);
Sheet firstSheet=工作簿。getSheetAt(0);
迭代器迭代器=firstSheet.Iterator();
while(iterator.hasNext()){
DataRecord=新的DataRecord();
行nextRow=iterator.next();
迭代器cellIterator=nextRow.cellIterator();
while(cellIterator.hasNext()){
record.setCardNumber(cellIterator.next().getStringCellValue());
record.setCvv(cellIterator.next().getStringCellValue());
record.setPostcode(cellIterator.next().getStringCellValue());
}
allData.add(记录);
}
inputStream.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
公共列表getAllData(){
返回所有数据;
}
public void setAllData(列出所有数据){
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
由以下原因引起:java.util.NoSuchElementException:null
位于java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1205)
位于java.util.TreeMap$ValueIterator.next(TreeMap.java:1252)
www.gov.uk.dwp.epayments.repository.DataRepository.(DataRepository.java:43)
www.gov.uk.dwp.epayments.service.PayService.(PayService.java:11)
www.gov.uk.dwp.epayments.controller.PaymentController.(PaymentController.java:23)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:422)
位于org.springframework.beans.BeanUtils.InstanceClass(BeanUtils.java:147)
... 省略18个公共框架

这段代码没有很好地完成,导致在确定是否有下一个单元格之前调用next()

Iterator<Cell> cellIterator = nextRow.cellIterator();
while (cellIterator.hasNext()) {
    record.setCardNumber(cellIterator.next().getStringCellValue());
    record.setCvv(cellIterator.next().getStringCellValue());
    record.setPostcode(cellIterator.next().getStringCellValue());
}
Iterator cellIterator=nextRow.cellIterator();
while(cellIterator.hasNext()){
record.setCardNumber(cellIterator.next().getStringCellValue());
record.setCvv(cellIterator.next().getStringCellValue());
record.setPostcode(cellIterator.next().getStringCellValue());
}
您正在检查一次它是否有下一项,但前进了三次。(接下来的三个例子)

如果每行的树单元数不超过个,则可以通过这种方式使用(这是许多可能的解决方案中唯一的一种):

Iterator 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());
}

请共享完整的stacktrace。您可能有一个额外的或缺少的列值,导致循环中断。请检查excel文件数据。在工作区中包含POI源,以调试迭代器中发生的具体情况。不相关,但一般提示:对于输入流,请使用try with resource或在f中关闭它最后,我决定重新制作电子表格,现在我无法从数字单元格中获取文本值,即使单元格已格式化为文本,arghMy代码正在运行,我收到错误,无法从数字单元格中获取文本值。我的变量定义为字符串,excel中的单元格格式为文本。对此问题有何想法E
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());
}