apache poi indexoutofbound 异常
apache poi indexoutofbound exception
Excel 文件 (test1.xlsx)
姓名 性别 年龄 辞职日期
阿里 M 20
阿布 M 25
西蒂 F 30
代码
public class ReadExcel {
public static ArrayList<String> record;
public static void main(String[] args) throws FileNotFoundException, IOException {
//---Read file---
FileInputStream in = new FileInputStream("test1.xlsx");
XSSFWorkbook workbook = new XSSFWorkbook(in);
XSSFSheet spreadsheet = workbook.getSheetAt(0);
XSSFRow row;
Cell cell;
Iterator<Row> rowIterator = spreadsheet.iterator();
while(rowIterator.hasNext()){
record = new ArrayList<String>();
row = (XSSFRow)rowIterator.next();
if(row.getRowNum()==0) {
continue;
}
for(int k = 0; k < row.getLastCellNum();k++){
cell = row.getCell(k, Row.CREATE_NULL_AS_BLANK);
}
Iterator<Cell> cellIterator = row.cellIterator();
while(cellIterator.hasNext()){
cell = cellIterator.next();
cell.setCellType(Cell.CELL_TYPE_STRING);
switch(cell.getCellType()){
case Cell.CELL_TYPE_STRING:
record.add(cell.getStringCellValue());
System.out.print(cell.getStringCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
Double value = cell.getNumericCellValue();
Long longValue = value.longValue();
record.add(Double.toString(cell.getNumericCellValue()));
System.out.print(cell.getNumericCellValue());
break;
}
}
System.out.println();
String name = record.get(0);
String gender = record.get(1);
String age = record.get(2);
String dateLeave = record.get(3); //[ERROR]
System.out.println(name + gender + age + dateLeave);
}
}
}
但是,从我上面的程序中,我得到了这个异常:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at ibguobform.ReadExcel.main(ReadExcel.java:66)
Java Result: 1
我犯了什么错误?
您的代码试图引用只有三个元素的集合的第四个元素:
record.get(3)
因为只有三个元素,尝试引用第四个会产生错误。
为什么只有三个元素?
嗯,看数据:
Ali M 20
Abu M 25
Siti F 30
每行三个元素。
似乎正在发生的事情是代码正在动态检查最后一个 "element":
for(int k = 0; k < row.getLastCellNum(); k++){
cell = row.getCell(k, Row.CREATE_NULL_AS_BLANK);
}
row.getLastCellNum()
似乎告诉代码只有三个单元格。 (因为,好吧,只有三个单元格包含数据。)如果第四个单元格即使在没有数据时也有效,请明确注意在代码中始终使用四个元素:
for(int k = 0; k < 4; k++){
cell = row.getCell(k, Row.CREATE_NULL_AS_BLANK);
}
Excel 文件 (test1.xlsx)
姓名 性别 年龄 辞职日期
阿里 M 20
阿布 M 25
西蒂 F 30代码
public class ReadExcel { public static ArrayList<String> record; public static void main(String[] args) throws FileNotFoundException, IOException { //---Read file--- FileInputStream in = new FileInputStream("test1.xlsx"); XSSFWorkbook workbook = new XSSFWorkbook(in); XSSFSheet spreadsheet = workbook.getSheetAt(0); XSSFRow row; Cell cell; Iterator<Row> rowIterator = spreadsheet.iterator(); while(rowIterator.hasNext()){ record = new ArrayList<String>(); row = (XSSFRow)rowIterator.next(); if(row.getRowNum()==0) { continue; } for(int k = 0; k < row.getLastCellNum();k++){ cell = row.getCell(k, Row.CREATE_NULL_AS_BLANK); } Iterator<Cell> cellIterator = row.cellIterator(); while(cellIterator.hasNext()){ cell = cellIterator.next(); cell.setCellType(Cell.CELL_TYPE_STRING); switch(cell.getCellType()){ case Cell.CELL_TYPE_STRING: record.add(cell.getStringCellValue()); System.out.print(cell.getStringCellValue()); break; case Cell.CELL_TYPE_NUMERIC: Double value = cell.getNumericCellValue(); Long longValue = value.longValue(); record.add(Double.toString(cell.getNumericCellValue())); System.out.print(cell.getNumericCellValue()); break; } } System.out.println(); String name = record.get(0); String gender = record.get(1); String age = record.get(2); String dateLeave = record.get(3); //[ERROR] System.out.println(name + gender + age + dateLeave); } } }
但是,从我上面的程序中,我得到了这个异常:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at ibguobform.ReadExcel.main(ReadExcel.java:66)
Java Result: 1
我犯了什么错误?
您的代码试图引用只有三个元素的集合的第四个元素:
record.get(3)
因为只有三个元素,尝试引用第四个会产生错误。
为什么只有三个元素?
嗯,看数据:
Ali M 20
Abu M 25
Siti F 30
每行三个元素。
似乎正在发生的事情是代码正在动态检查最后一个 "element":
for(int k = 0; k < row.getLastCellNum(); k++){
cell = row.getCell(k, Row.CREATE_NULL_AS_BLANK);
}
row.getLastCellNum()
似乎告诉代码只有三个单元格。 (因为,好吧,只有三个单元格包含数据。)如果第四个单元格即使在没有数据时也有效,请明确注意在代码中始终使用四个元素:
for(int k = 0; k < 4; k++){
cell = row.getCell(k, Row.CREATE_NULL_AS_BLANK);
}