运行自动化测试触发Java NullPointerException,求定位问题原因
分析与解决ExcelUtil中的NullPointerException
先看你给出的错误栈,java.lang.NullPointerException出现在ExcelUtil.getTestData()方法的第38行:data[i][k] = sheet.getRow(i+1).getCell(k).toString();,这个空指针的根源无非两种情况:
- 第
i+1行本身不存在(也就是sheet.getRow(i+1)返回null) - 该行的第
k列单元格为空(也就是getCell(k)返回null)
接下来一步步排查和解决:
1. 先确认Excel测试数据的有效性
- 检查
Add_Event_Sheet_Name对应的工作表:- 确保表头行(第0行)下方有完整的测试数据行,没有完全空的行
- 确认每一行的列数和你测试方法
addEventDetails的参数数量(16个)完全匹配,且每个单元格都有值(至少不是空单元格)
2. 修改ExcelUtil代码,添加空值防护
直接链式调用getRow().getCell().toString()太容易触发空指针,必须对每一步做非空校验,同时还要处理不同单元格类型(避免数字/日期转字符串出问题),可以把报错行替换成下面的代码:
// 替换原第38行的链式调用 Row row = sheet.getRow(i+1); if (row != null) { Cell cell = row.getCell(k); if (cell != null) { // 根据单元格类型处理值,避免类型转换错误 switch (cell.getCellType()) { case STRING: data[i][k] = cell.getStringCellValue(); break; case NUMERIC: // 区分日期和普通数字 if (DateUtil.isCellDateFormatted(cell)) { data[i][k] = cell.getDateCellValue().toString(); } else { // 数字转字符串,避免科学计数法 data[i][k] = String.valueOf((long) cell.getNumericCellValue()); } break; case BOOLEAN: data[i][k] = String.valueOf(cell.getBooleanCellValue()); break; default: data[i][k] = ""; // 其他类型或空内容设为空字符串 break; } } else { data[i][k] = ""; // 单元格为空时设默认值 } } else { // 行不存在时抛出明确异常,方便定位问题 throw new RuntimeException("测试数据行 " + (i+1) + " 不存在,请检查Excel文件"); }
3. 校验DataProvider的行列数计算逻辑
确保ExcelUtil.getTestData()中计算行数和列数的逻辑是准确的,比如:
// 获取实际有数据的行数,跳过空行 int rowCount = sheet.getPhysicalNumberOfRows(); // 用表头行的列数作为基准,避免列数计算错误 int columnCount = sheet.getRow(0).getPhysicalNumberOfCells();
4. 额外检查:测试方法的传参是否正确
看你测试方法中调用EditEvent时,第三个参数传的是calendervalue,但EditEvent方法的第三个参数是addnewcalender,这明显是传参位置错误:
// 你的测试方法调用 dealspage.EditEvent(title, calendervalue, calender, calendervalue,...); // EditEvent的参数定义 public void EditEvent(String title,String calender,String addnewcalender,String calender1,...)
虽然这不是空指针的直接原因,但可能导致后续功能异常,建议同步修正。
另外,可以在ExcelUtil中添加简单的日志打印,比如记录当前处理的行号和列号,方便快速定位哪一行哪一列出了问题。
内容的提问来源于stack exchange,提问作者sandy
相关产品推荐
相关产品推荐

