Selenium数据驱动测试:读取XLSX文件时出现空指针异常
解决Selenium读取.xlsx文件时的空指针异常问题
嘿,我明白你在学Selenium数据驱动测试时碰到的糟心事——读Excel文件触发空指针异常太常见了!结合你给出的代码片段,我帮你梳理几个最可能的原因,还有对应的修复方案:
一、常见触发原因及修复方法
1. 文件路径不对或文件压根不存在
如果你的File对象指向的路径有误,或者文件被误删、移动了,后续的FileInputStream初始化就会出问题,进而导致POI相关对象变成null,调用方法时就会触发空指针。
怎么修:
- 先换成绝对路径测试,比如:
File excelFile = new File("C:\\selenium_test\\test_data.xlsx"); - 提前加个文件存在性检查,避免白忙活:
if (!excelFile.exists()) { System.out.println("救命!文件找不到,先检查路径对不对!"); return; }
2. POI对象没做非空判断就直接用
从你贴的代码看,你导入了XSSFRow,但很可能在获取工作表、行或者单元格时,没判断这些对象是不是null。比如你要读的Sheet不存在,或者某一行是空的,直接调用方法肯定炸。
怎么修:
- 获取Sheet时先检查:
XSSFWorkbook workbook = new XSSFWorkbook(inputStream); XSSFSheet sheet = workbook.getSheet("Sheet1"); // 或者用getSheetAt(0)取第一个Sheet if (sheet == null) { System.out.println("指定的工作表不存在啊!"); workbook.close(); inputStream.close(); return; } - 遍历行和单元格时也要加非空判断:
Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); if (row == null) continue; // 跳过空行 Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); if (cell == null) continue; // 跳过空单元格 // 这里处理单元格数据 switch (cell.getCellType()) { case STRING: System.out.println(cell.getStringCellValue()); break; case NUMERIC: System.out.println(cell.getNumericCellValue()); break; // 其他类型按需处理 } } }
3. 流和Workbook没正确关闭(潜在坑)
虽然这不一定直接导致空指针,但未关闭的流可能会让文件被占用,或者数据读取不完整,间接引发异常。一定要在finally块里关闭资源:
怎么修:
FileInputStream inputStream = null; XSSFWorkbook workbook = null; try { inputStream = new FileInputStream(excelFile); workbook = new XSSFWorkbook(inputStream); // 这里写读取数据的逻辑 } catch (IOException e) { e.printStackTrace(); } finally { try { if (inputStream != null) inputStream.close(); if (workbook != null) workbook.close(); } catch (IOException e) { e.printStackTrace(); } }
二、完整可参考的示例代码
给你一个带全非空判断的完整读取示例,你可以对照着改自己的代码:
package com.usman; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Iterator; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelDataReader { public static void main(String[] args) { File excelFile = new File("你的文件绝对路径.xlsx"); FileInputStream inputStream = null; XSSFWorkbook workbook = null; try { // 先检查文件是否存在 if (!excelFile.exists()) { System.err.println("错误:文件不存在,请核对路径!"); return; } inputStream = new FileInputStream(excelFile); workbook = new XSSFWorkbook(inputStream); // 获取第一个工作表 XSSFSheet sheet = workbook.getSheetAt(0); if (sheet == null) { System.err.println("错误:工作表不存在!"); return; } // 遍历所有行 Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); if (row == null) continue; // 遍历当前行的所有单元格 Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); if (cell == null) continue; // 根据单元格类型处理数据 switch (cell.getCellType()) { case STRING: System.out.print(cell.getStringCellValue() + "\t"); break; case NUMERIC: System.out.print(cell.getNumericCellValue() + "\t"); break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break; default: System.out.print("未知类型\t"); } } System.out.println(); } } catch (IOException e) { e.printStackTrace(); } finally { // 务必关闭资源 try { if (inputStream != null) inputStream.close(); if (workbook != null) workbook.close(); } catch (IOException e) { e.printStackTrace(); } } } }
三、额外排查小技巧
- 检查POI依赖版本,尽量用稳定版本(比如4.1.2或更高),版本冲突也可能导致奇怪的空指针。
- 试试用一个新建的简单Excel文件测试,排除原文件损坏的可能。
内容的提问来源于stack exchange,提问作者usman ahmad
相关产品推荐
相关产品推荐

