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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:01:50