You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行自动化测试触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 07:18:15