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

Android空指针异常求助:添加属性时调用Cursor方法触发报错

解决添加属性时的java.lang.NullPointerException问题

嘿,我看到你在添加包含ID、名称、邮箱、手机号以及Owner Spinner数据的属性时,碰到了java.lang.NullPointerException,错误提示是“Attempt to invoke virtual method 'android.database.Cursor...'”,咱们来拆解问题并搞定它。

问题根源分析

看你贴出的getOwnerById代码,核心问题出在这里:

if (cursor != null) { 
    cursor.moveToFirst(); 
} 
Owner owner = cursorToOwner(cursor); 

当数据库查询不到对应ID的Owner时,query方法可能返回null,或者cursor不为null但内部没有数据(moveToFirst返回false),这时候你依然把cursor传给了cursorToOwner方法,后续操作cursor的方法自然就触发了空指针异常。另外还有个隐藏问题:你没有关闭cursor,长期运行会导致内存泄漏。

修复后的代码方案

我调整了getOwnerById方法,补上了完整的有效性判断和资源释放逻辑:

public Owner getOwnerById(long id) { 
    Cursor cursor = null;
    try {
        // 执行数据库查询
        cursor = sqLiteDatabase.query(DataBaseHelper.TABLE_NAME, mAllKey, 
            DataBaseHelper.KEY_ID + " = ?", new String[] { String.valueOf(id) }, 
            null, null, null); 
        
        // 双重校验:cursor不为空 且 存在可读取的数据
        if (cursor != null && cursor.moveToFirst()) { 
            return cursorToOwner(cursor); 
        }
        
        // 根据业务需求返回null,或者新建一个空的Owner对象
        return null;
    } finally {
        // 无论查询成功与否,都要关闭cursor释放资源
        if (cursor != null) {
            cursor.close();
        }
    }
}

额外注意事项

  • 检查你的cursorToOwner方法,建议在方法开头加空判断,避免内部解析时出问题:
    private Owner cursorToOwner(Cursor cursor) {
        if (cursor == null) {
            return null;
        }
        // 原有的cursor解析逻辑
        Owner owner = new Owner();
        owner.setId(cursor.getLong(cursor.getColumnIndex(DataBaseHelper.KEY_ID)));
        // ...其他属性赋值逻辑
        return owner;
    }
    
  • 在调用getOwnerById获取Owner数据并绑定Spinner的地方,一定要先判断返回的Owner是否为null,再进行后续赋值操作,避免Spinner触发空指针。
  • 确认你的sqLiteDatabase对象已经正确初始化(不为null),这也是数据库操作中空指针的常见诱因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:09:17