吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 767|回复: 4
收起左侧

[Android 求助] 方法接受对象后在使用时发生空对象引用问题

[复制链接]
du1263794094 发表于 2024-7-10 23:26
25吾爱币
有一个是内部类的重写某接口的方法,其中一段代码是
[Java] 纯文本查看 复制代码
HYKLDeviceCore sharedCore = HYKLDeviceCore.sharedCore();
HYKLDancingActivity hYKLDancingActivity2 = HYKLDancingActivity.this;
sharedCore.init(hYKLDancingActivity2, hYKLDancingActivity2.mMAC);

它的意思是先从HYKLDeviceCore创建一个sharedCore对象,再获取外部类HYKLDacingActivity的实例,最后调用sharedCore的init方法,并传递外部类实例及这个实例的mMAC。
这段代码前面有各种判断,我想跳过判断,直接执行这段代码,于是我在外部类的方法体里,写成这样
[Java] 纯文本查看 复制代码
HYKLDeviceCore.sharedCore().init(this, this.mMAC);

接着看init方法,完整代码如下
[Java] 纯文本查看 复制代码
public synchronized void init(Context context, String str) {
        this.mIsQueryDevice = false;
        this.stateListener = null;
        this.commandListener = null;
        this.mContext = context;
        AnalyTools.setWaterCodeListener(this);
        if (str.substring(0, 2).equalsIgnoreCase("00")) {
            if (this.mbtService == null) {
                BluetoothService sharedManager = BluetoothService.sharedManager();
                this.mbtService = sharedManager;
                sharedManager.setHandlerContext(this.mHandler);
            }
        } else if (this.mbtBLEService == null) {
            EventBus.getDefault().register(this);
            BleBluetoothService sharedManager2 = BleBluetoothService.sharedManager(context);
            this.mbtBLEService = sharedManager2;
            sharedManager2.setHandlerContext(this.mBLEHandler);
        }
        if (this.mHandlerThread == null) {
            HandlerThread handlerThread = new HandlerThread("KLWriteThread");
            this.mHandlerThread = handlerThread;
            handlerThread.start();
            this.mWriteHandler = new Handler(this.mHandlerThread.getLooper());
        }
        if (this.mMainWriteHandler == null) {
            this.mMainWriteHandler = new Handler(context.getMainLooper());
        }
        IntentFilter intentFilter = new IntentFilter("android.bluetooth.adapter.action.STATE_CHANGED");
        intentFilter.addAction("android.bluetooth.device.action.BOND_STATE_CHANGED");
        this.mContext.registerReceiver(this.mStatusReceive, intentFilter);


但是init方法在执行时报错,logcat日志显示
[Java] 纯文本查看 复制代码
07-03 17:27:05.708 12211 12211 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.aaaaaa.bbbbbbbbb/com.aaaaaa.bbbbbbbbb.activity.device.HYKLDancingActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Looper android.content.Context.getMainLooper()' on a null object reference
07-03 17:27:05.708 12211 12211 E AndroidRuntime:        at com.aaaaaa.bbbbbbbbb.core.HYKLDeviceCore.init(HYKLDeviceCore.java:133)


错误就出在这行代码
[Java] 纯文本查看 复制代码
if (this.mMainWriteHandler == null) {
            this.mMainWriteHandler = new Handler(context.getMainLooper());


按传递逻辑来看,context就是此方法接收的HYKLDacingActivity对象,那么为什么这段代码在使用时报空对象引用错误呢?难道我写的调用init方法传递参数表达错了吗?
(再贴一遍我在HYKLDacingActivity外部类写的代码)
[Java] 纯文本查看 复制代码
HYKLDeviceCore.sharedCore().init(this, this.mMAC);

附上sharedCore方法代码
[Java] 纯文本查看 复制代码
 
[color=#0000ff][b]private[/b][/color][color=#000000] [/color][color=#0000ff][b]static[/b][/color][color=#000000] [/color][color=#0000ff][b]volatile[/b][/color][color=#000000] [/color][color=#000000]HYKLDeviceCore[/color][color=#000000] [/color][color=#000000]instance[/color][color=#000000];[/color]
public static HYKLDeviceCore sharedCore() {
        if (instance == null) {
            synchronized (HYKLDeviceCore.class) {
                if (instance == null) {
                    instance = new HYKLDeviceCore();
                }
            }
        }
        return instance;
    }

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Maxhaha 发表于 2024-7-11 07:04
我咋感觉是你传的this有问题呢。。。   就是这段代码
[Java] 纯文本查看 复制代码
HYKLDeviceCore.sharedCore().init(this, this.mMAC);
  这个this你确定不是空的么   你可以打断点看下   看错误提示貌似是context为空,所以导致context..getMainLooper()直接报空指针异常
 楼主| du1263794094 发表于 2024-7-11 17:08
Maxhaha 发表于 2024-7-11 07:04
我咋感觉是你传的this有问题呢。。。   就是这段代码[mw_shl_code=java,true]HYKLDeviceCore.sharedCore(). ...

就是不知道我写的这句语法对不对,软件原本是在内部类里调用init方法,是先获取了外部类的实例对象,然后再把这个实例对象作为参数传递,我想直接在外部类调用init方法,不确定写this是否就传递了当前实例,我问了chatgpt,他说是可以的,但是执行报错了
Maxhaha 发表于 2024-7-12 07:02
du1263794094 发表于 2024-7-11 17:08
就是不知道我写的这句语法对不对,软件原本是在内部类里调用init方法,是先获取了外部类的实例对象,然后 ...

你可以试试把this 改成 HYKLDancingActivity.this
Kuronoks 发表于 2024-7-13 05:49
debug对比一下前后两种写法传到context的是啥不就清楚了吗
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 19:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表