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
相关产品推荐
相关产品推荐

