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

调用函数时触发Null Pointer Exception问题求助

解决NullPointerException:同一类中调用同一方法时而正常时而报错的问题

看起来你遇到的问题很典型——tommy这个ApproveNewApplicationSteps实例在approveNewEnvironment方法里是null,但在approveNewApplication里却能正常工作。咱们来拆解原因和解决方案:

问题根源分析

你用了@Steps注解来标注tommy,这类注解一般是测试框架(比如Serenity、Cucumber)用来做依赖注入的——也就是框架帮你自动创建实例、初始化对象。但这个注入逻辑只在框架管理的生命周期内生效:

  • 当approveNewApplication被调用时,它是测试流程的一部分,框架已经完成了tommy的注入,所以能正常运行;
  • 但调用approveNewEnvironment时,要么是你手动new了Approvals对象(没走框架的实例化流程),要么这个方法是在测试上下文之外被触发的,导致@Steps的注入逻辑没执行,tommy还是null,自然触发空指针。

另外还要注意:就算tommy被初始化了,ApproveNewApplicationSteps里的JohnDoe也是未赋值的,调用logIntoApproverAccount时还会触发新的空指针,这个也要一起解决。

具体解决方案

1. 确保Approvals的实例由框架管理

不要手动通过new Approvals()来创建对象,而是让测试框架来负责Approvals的实例化(比如通过测试类的依赖注入、测试上下文加载)。这样框架会自动处理@Steps注解的对象注入,tommy就不会是null了。

2. 临时调试:手动初始化tommy(不推荐长期用)

如果因为某些场景必须手动调用approveNewEnvironment,可以临时在方法里初始化tommy,同时给JohnDoe赋值:

public void approveNewEnvironment(String envName){ 
    if(tommy == null) {
        tommy = new ApproveNewApplicationSteps();
        // 因为Approvals继承自SnowPortalBasePage,直接把当前实例传给JohnDoe
        tommy.JohnDoe = this;
    }
    tommy.logIntoApproverAccount(); 
}

⚠️ 注意:这种方式会绕开框架的依赖注入逻辑,长期来看可能引发其他问题,尽量还是用框架管理实例的方式。

3. 检查框架的@Steps配置

确认你用的测试框架(比如Serenity)是否正确配置了Steps扫描:

  • 测试类是否添加了框架所需的注解(比如@SerenityTest);
  • 项目的配置文件是否开启了Steps的自动注入功能;
  • ApproveNewApplicationSteps是否符合框架的Steps类要求(比如是公共类、有无参构造方法)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:18:39