读取Excel文件数据时出现Null Pointer Exception的问题求助
排查Java读取Excel时的空指针异常问题
嗨,我来帮你定位这个空指针异常的问题!结合你的代码和Excel场景,大概率是这几个原因导致的,咱们一步步来分析:
可能的异常原因
- 行对象为null:
sheet.getRow(i)会返回null,如果Excel里对应的行是完全空白的(哪怕你手动插入了行但没填任何数据,POI也会认为这行不存在)。你的循环从i=1开始,如果第2行(POI索引从0开始)是空白行,调用getCell(0)就会直接触发空指针。 - 单元格对象为null:就算行存在,
getCell(0)也可能返回null——如果这个单元格完全没有数据(连格式都没设置过),这时候调用getStringCellValue()自然会报错。 - (小概率)文件或工作表不存在:虽然你的代码里没报文件找不到的错,但还是可以确认下
D:\TestData.xls确实存在,且工作表索引0对应的是你要读取的sheet。
解决办法:增加null判断+单元格类型处理
我给你修改了代码,加入了完整的空值校验,还有单元格类型兼容处理(避免后续出现类型转换异常):
@Test public void dataProviderMethod() throws InvocationTargetException, FileNotFoundException { try { File src = new File("D:\\TestData.xls"); FileInputStream fis = new FileInputStream(src); HSSFWorkbook wb = new HSSFWorkbook(fis); HSSFSheet sheet = wb.getSheetAt(0); // 先判断工作表是否存在 if (sheet == null) { System.out.println("目标工作表不存在,请检查sheet索引"); return; } int rowcount = sheet.getLastRowNum() + 1; System.out.println("总行数:" + rowcount); for(int i = 1; i < rowcount; i++) { HSSFRow row = sheet.getRow(i); // 判断当前行是否为空,为空则跳过 if (row == null) { System.out.println("第" + (i+1) + "行(POI索引" + i + ")为空,跳过"); continue; } HSSFCell cell = row.getCell(0); String questionType = ""; // 处理单元格为空或不同类型的情况 if (cell != null) { switch (cell.getCellType()) { case STRING: questionType = cell.getStringCellValue().trim(); // 去除首尾空格 break; case NUMERIC: // 如果是数字类型(比如序号),转换为字符串 questionType = String.valueOf((int) cell.getNumericCellValue()); break; case BLANK: questionType = ""; break; default: questionType = cell.toString().trim(); } } System.out.println("第" + (i+1) + "行的questionType:" + questionType); } // 记得关闭资源,避免内存泄漏 wb.close(); fis.close(); } catch (IOException e) { e.printStackTrace(); } }
额外排查建议
- 打开你的Excel,检查第2行(对应代码里的
i=1)是否真的有数据,有没有完全空白的行; - 确认A列的单元格都有内容,没有完全空的单元格;
- 可以先打印
row和cell的对象,看看哪个是null,精准定位问题点。
内容的提问来源于stack exchange,提问作者swapnil bargale
相关产品推荐
相关产品推荐

