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

从SQLite数据库读取数据时出现空对象引用错误排查

分析与解决:SQLite查询时的Null Object Reference错误

你遇到的这个空指针错误(Attempt to invoke virtual method on a null object reference),根源非常清晰——你的db_adapter对象从未被初始化就直接调用了它的方法。

错误原因拆解

在你的fragment_home_left类中,你只声明了数据库适配器变量:

Login_Signup_DB_adapter db_adapter;

但从头到尾都没有给它赋值(也就是没有创建Login_Signup_DB_adapter的实例)。当你在Fetch_user_data()方法中调用db_adapter.getAll_users()时,db_adapter还是null,系统自然会抛出空指针异常。

具体修复步骤

1. 初始化数据库适配器

在Fragment的onCreateView方法中,获取到上下文后,立即初始化db_adapter。如果你的数据库适配器类需要打开连接(通常会有open()方法),也要记得调用:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_main_activity_home_left, container, false);
    
    // 初始化数据库适配器(关键!之前缺失的步骤)
    db_adapter = new Login_Signup_DB_adapter(requireContext());
    // 如果你的Login_Signup_DB_adapter类有open方法,打开数据库连接
    db_adapter.open();

    // 其他控件初始化代码...
    display_users = (Button)view.findViewById(R.id.button_display_users);
    display_box = (TextView) view.findViewById(R.id.editText_displayBox);
    display_users.setOnClickListener(this);

    return view;
}

这里用requireContext()代替getActivity()更安全,因为它会确保上下文非空,避免Fragment detached时的潜在空指针。

2. 关闭数据库连接避免资源泄漏

在Fragment销毁时,记得关闭数据库连接,防止资源泄漏:

@Override
public void onDestroy() {
    super.onDestroy();
    if (db_adapter != null) {
        db_adapter.close(); // 对应open方法的关闭操作
    }
}

3. 优化Cursor处理(可选但推荐)

处理Cursor时,使用Java的try-with-resources语法可以自动关闭Cursor,避免手动关闭遗漏导致的资源泄漏:

private void Fetch_user_data() {
    Log.i(TAG, "Fetch_user_data: CALLING FETCH USER DATA METHOD");
    try (Cursor cursor = db_adapter.getAll_users()) {
        Log.i(TAG, "Fetch_user_data: CURSOR RECIEVED SOMETHING");
        Display_user_data(cursor);
    } catch (Exception e) {
        Log.e(TAG, "Failed to fetch user data", e);
        Toast.makeText(requireContext(), "Failed to load data", Toast.LENGTH_SHORT).show();
    }
}

额外检查点

确保你的Login_Signup_DB_adapter类中的getAll_users()方法正确实现,能返回有效的Cursor。比如类似这样的实现:

public Cursor getAll_users() {
    SQLiteDatabase db = this.getReadableDatabase();
    return db.query(USER_TABLE_NAME, null, null, null, null, null, null);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:14:00