HarmonyOS 鸿蒙Next 在给组件对象添加监听器时报错 Attempt to invoke virtual method XXX on a null object reference

发布于 1周前 作者 zlyuanteng 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 在给组件对象添加监听器时报错 Attempt to invoke virtual method XXX on a null object reference 在实现了Component.ClickedListener接口并且重写了onClick方法的MainAbility类里声明了成员Button,并在onStart方法里通过findComponentById(ResourceTable.Id_submit)方法找到了布局文件中的对应组件(ctrl点击Id_submit是能跳转到布局文件的对应位置的),再后来给该对象用.setClickedListener(this)方法设置监听器时报错。

报错内容为:

java.lang.NullPointerException: Attempt to invoke virtual method 'void ohos.agp.components.Button.setClickedListener(ohos.agp.components.Component$ClickedListener)' on a null object reference

MainAbility类代码为:

public class MainAbility extends Ability implements Component.ClickedListener {
    Button sub;

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setMainRoute(MainAbilitySlice.class.getName());
        sub = findComponentById(ResourceTable.Id_submit);
        // 下边这一行报错
        sub.setClickedListener(this);
    }

    @Override
    public void onClick(Component component) {
        if (component == sub) {
            sub.setClickable(false);
        }
    }
}

很奇怪的是,我之前能正常跑起来的代码在今天发现这个问题后也跑不起来了,报错内容也一致,都是在给组件添加监听器时发生的问题。


更多关于HarmonyOS 鸿蒙Next 在给组件对象添加监听器时报错 Attempt to invoke virtual method XXX on a null object reference的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

你好,用你的代码试了一下,我是不能跳转到布局文件的(即找不到Id_submit),我推测也是找不到button这个组件所以报了空指针。解决方法是将这些按钮以及单击事件写在MainAbilitySlice文件下就可以的,因为一个Ability可以有多个Slice,每个Slice又对应一个布局文件,如果直接写在Ability,是找不到布局文件的(大概原理就是这样,如果有说得不对的地方欢迎其他开发者朋友指出)

更多关于HarmonyOS 鸿蒙Next 在给组件对象添加监听器时报错 Attempt to invoke virtual method XXX on a null object reference的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


非常感谢,我把MainAbility里的代码挪到Slice里就可以成功跑起来了,看起来是我还没有太搞明白AbilitySlice之间的关系,所以把这玩意弄错了。我还处在新手阶段,还得多学习才是[捂脸],最后还是您的感谢帮助!

很开心能够帮助到你,大家一起成长!

欢迎开发小伙伴们进来帮帮楼主

在HarmonyOS鸿蒙Next系统中,给组件对象添加监听器时报错“Attempt to invoke virtual method XXX on a null object reference”,通常意味着你试图在一个尚未初始化(即为null)的对象上调用方法。

这种错误常见于以下几种情况:

  1. 组件对象未正确初始化:在调用组件的监听器设置方法前,确保该组件已被正确创建并初始化。检查组件的创建代码,确保没有在任何条件分支中遗漏了组件的初始化。

  2. 布局文件中未定义组件:如果你在代码中引用了布局文件中的组件,确保布局文件里确实定义了该组件,并且ID正确无误。

  3. 组件查找时机错误:如果你是在组件还未被加载到界面时就尝试查找并设置监听器,会导致找到的对象为null。确保在组件加载完成后(如onPageStartedonElementClick等生命周期方法中)进行查找和设置。

  4. 代码逻辑错误:检查代码逻辑,确保在设置监听器前没有任何可能导致组件对象为null的操作。

针对以上情况,逐一排查并修正。如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!