当前位置: 首页 > 知识库问答 >
问题:

尝试对空对象引用调用接口方法“…”

公西俊才
2023-03-14

我正在开发一个具有蓝牙功能的应用程序。我使用一个片段来扫描并列出蓝牙设备。单击时,会回调到提供所选蓝牙设备的主要活动。

我一开始使用的是Android 6(API 23)的智能手机,然后不得不调整代码以适应Android 5.0(API 21)的使用。
我只是将minSDK更改为API21并重新构建了项目,没有任何问题。

该应用程序在智能手机上运行时没有任何问题。安装了Android5的平板电脑运行了该应用程序,但当我选择蓝牙设备时,它会出现空指针异常。

我还没有找到解决这个问题的办法,也不知道如何继续下去。也许有人能帮忙?:-)

日志为:

me: FATAL EXCEPTION: main
Process: de.tuhh.et5.tills.biocontrol, PID: 26512
java.lang.NullPointerException: Attempt to invoke interface method 'void de.tuhh.et5.tills.biocontrol.activity.BLEListFragment$OnBLEDeviceSelectedListener.OnBLEDeviceSelected(android.bluetooth.BluetoothDevice)' on a null object reference                                                                                    at de.tuhh.et5.tills.biocontrol.activity.BLEListFragment.onListItemClick(BLEListFragment.java:92)
at android.app.ListFragment$2.onItemClick(ListFragment.java:160)
at android.widget.AdapterView.performItemClick(AdapterView.java:305)
at android.widget.AbsListView.performItemClick(AbsListView.java:1185)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3222)
at android.widget.AbsListView$3.run(AbsListView.java:4138)
at android.os.Handler.handleCallback(Handler.java:815)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5568)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955)                                                                                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750)

由于这是大量的代码,我将尝试总结一些重要的代码:

错误指的是这种方法

@Override
public void onListItemClick(ListView mBluetoothLeDeviceList, View v, int position, long id) {
    if(DEBUG)d("onListItemClick()");
    mBluetoothLeDeviceList.getChildAt(position).setBackgroundColor(Color.GREEN); // set background
    mBluetoothLeDeviceList.getChildAt(position).setFocusable(false); // not clickable again
    mCallback.OnBLEDeviceSelected(mListAdapter.getDevice(position));
}

Mcallback的最后一行...生成空指针异常。蓝牙设备肯定不是空的,所以在Android5.0下出现的回调肯定有问题(我听起来不对:-))

OnBLEDeviceSelectedListener mCallback;
public interface OnBLEDeviceSelectedListener {
    void OnBLEDeviceSelected(BluetoothDevice device);
}

这可以确保在主活动中实现侦听器:

try {
        mCallback = (OnBLEDeviceSelectedListener) context;
    } catch (ClassCastException e) {
        throw new ClassCastException(context.toString()
                + " must implement OnBLEDeviceeSelectedListener");
    }

主要活动实现了BlelistFragment.OnbleDeviceSelectedListener并包含

@Override
public void OnBLEDeviceSelected(BluetoothDevice device) {
.
.
.}

就是这样。我觉得它很奇怪,它在一个设备上工作,而在另一个设备上却崩溃了,没有任何编译错误。

共有1个答案

陆城
2023-03-14
Make sure you implement both methods in fragment like this.

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    //Your callback initialization here
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(context);
    //Your callback initialization here
}
 类似资料: