读取Excel数据时Null值赋值问题与测试执行报错排查
Excel数据驱动测试读取异常问题排查与修复
问题场景
- 当Excel表格含表头共5行(4行数据)时,测试可执行,但第4行数据被识别为Null;
- 当Excel表格含表头共2行(1行数据)时,触发报错:
testOnboardProvider (null, null, null, null, null, null), java.lang.IllegalArgumentException: Keys to send should be a not null CharSequence
问题根源分析
你的ReadExcel类中readExcel方法存在3个核心错误:
- 循环边界错误:
for (int i = 1; i < rows; i++)中,rows是getLastRowNum()返回的索引(从0开始计数)。当表格有5行(表头+4数据行)时,rows=4,循环仅执行到i=3,第4行数据(索引3)完全没被读取;当表格只有2行(表头+1数据行)时,rows=1,循环条件不成立直接跳过,返回的二维数组全为默认null值,导致测试方法接收空参数触发报错。 - 列数获取逻辑错误:
int cells = wSheet.getRow(rows).getLastCellNum()拿最后一行的列数,若最后一行数据列数少于表头,会导致列数统计偏差,应该从表头行(索引0)获取列数更合理。 - 未处理空单元格/行:直接调用
getStringCellValue()遇到空单元格会返回null或抛异常,且未处理空行场景。
修复后的代码
public class OnboardProvider extends ProjectSpecificMethods { @Test(dataProvider = "sendData") public void testOnboardProvider(String ProviderName, String Email, String contactperson, String phno, String address, String pincode) throws InterruptedException { new LoginPage() .enterUsername("manojgumma221@gmail.com") .enterPassword("9491233055") .clickLogin() .clickUserManagement() .clickProviderUser() .clickOnAddNewProvider() .enterName(ProviderName) .enterEmail(Email) .enterContactPerson(contactperson) .enterContactNumber(phno) .enterAddress(address) .selectCountry() .selectState() .SelectCity() .enterZipCode(pincode) .clickOnboard() .verifyProverName(); Thread.sleep(5000); } public class ReadExcel { public String[][] readExcel() throws IOException { XSSFWorkbook wBWorkbook = new XSSFWorkbook("./Data/auto.xlsx"); XSSFSheet wSheet = wBWorkbook.getSheet("Sheet1"); // 处理Sheet不存在的情况 if(wSheet == null){ wBWorkbook.close(); return new String[0][0]; } int totalRows = wSheet.getLastRowNum() + 1; // 总行数(含表头) int totalDataRows = totalRows - 1; // 数据行数(去掉表头) // 无数据行直接返回空数组 if(totalDataRows <=0){ wBWorkbook.close(); return new String[0][0]; } // 从表头行获取列数 int cells = wSheet.getRow(0).getLastCellNum(); String[][] data = new String[totalDataRows][cells]; // 遍历所有数据行(从索引1开始到最后一行) for (int i = 1; i < totalRows; i++) { XSSFRow row = wSheet.getRow(i); if(row == null){ // 空行填充空字符串 for(int j=0;j<cells;j++){ data[i-1][j] = ""; } continue; } for (int j = 0; j < cells; j++) { XSSFCell cell = row.getCell(j); String value = ""; if(cell != null){ // 处理不同单元格类型,统一转为字符串 switch (cell.getCellType()) { case STRING: value = cell.getStringCellValue(); break; case NUMERIC: value = String.valueOf(cell.getNumericCellValue()); // 整数类型去掉小数点后多余的0 if(value.endsWith(".0")){ value = value.substring(0, value.indexOf(".")); } break; case BOOLEAN: value = String.valueOf(cell.getBooleanCellValue()); break; default: value = ""; } } data[i - 1][j] = value; System.out.println(value); } } wBWorkbook.close(); return data; } } }
关键修复说明
- 修正循环范围:用
totalRows = wSheet.getLastRowNum() + 1获取真实总行数,循环覆盖所有数据行,避免遗漏; - 列数从表头获取:保证列数统计准确,不受数据行列数不一致影响;
- 空行/空单元格处理:为空行和空单元格填充空字符串,同时支持数值、布尔等不同单元格类型转字符串,避免类型异常;
- 增加异常防护:处理Sheet不存在、无数据行的边缘场景,避免空指针异常。
内容的提问来源于stack exchange,提问作者Manoj Gumma
相关产品推荐
相关产品推荐

