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

Selenium脚本调用log4j Logger.info报空指针异常问题求助

Selenium自动化测试log4j日志空指针异常排查

前置已完成配置

  • pom文件中已引入log4j的Maven依赖
  • log4j配置文件已放置在项目主目录下

报错信息

java.lang.NullPointerException: Cannot invoke "org.apache.log4j.Logger.info(Object)" because "blocknet_maven_hybird_framework_v1.testcases.TC_login.logger" is null

根因分析

核心问题是变量作用域混淆:

  1. 你的TC_login类中定义了名为logger的类成员变量,但在驱动初始化代码块中,重新写了Logger logger = Logger.getLogger(TC_login.class);,这行代码实际声明了一个和类成员同名的局部变量
  2. 初始化赋值操作只作用于方法内的局部logger变量,类层面的成员变量logger从未被赋值,始终为null
  3. 后续登录流程中调用logger.info()时,JVM优先访问类成员变量,拿到null值就触发了空指针异常

额外发现一处逻辑错误:代码中设置的隐式等待implicitlyWait(3000,TimeUnit.SECONDS)代表等待3000秒(约50分钟),属于单位和数值匹配错误,正常3秒隐式等待应写为implicitlyWait(3,TimeUnit.SECONDS)。

修复步骤

  1. 调整logger变量的赋值逻辑,不要在初始化方法内声明同名局部变量,直接给类成员变量赋值,修正后的代码参考:
public class TC_login {
    // 类层面统一声明成员变量
    WebDriver driver;
    Logger logger;

    // 驱动初始化方法(对应@BeforeTest/setup注解修饰的初始化逻辑)
    public void initDriver() {
        driver = new ChromeDriver();
        // 去掉前面的Logger类型声明,直接给类成员变量赋值
        logger = Logger.getLogger(TC_login.class);
        PropertyConfigurator.configure("Log4j.properties");
        // 修正隐式等待参数
        driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
    }

    // 登录测试用例逻辑
    public void testLogin() {
        login_page lp = new login_page(driver);
        lp.setUserName(username);
        logger.info("username entered");
        lp.setPassword(password);
        lp.clickSubmit();
        
        Assert.assertEquals(driver.getTitle(), "EveryCred");
    }
}
  1. 编译项目后确认Log4j.properties文件被打包到类加载路径下,避免配置文件读取失败的衍生问题。

内容的提问来源于stack exchange,提问作者maxl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:09:41