SQLite查询返回Null致空指针异常:特定条目查询方法故障
排查并解决SQLite查询返回Null导致的NullPointerException问题
我来帮你梳理这个问题的几个核心原因和对应的解决方案:
1. SQL语句字符串拼接的语法错误(最可能的直接原因)
你的代码里直接把字符串类型的filtro拼进SQL语句,却没有给它加单引号,这会导致SQL解析错误,根本查不到数据。比如如果filtro的值是"OBRA001",生成的SQL会是:
SELECT * FROM obra WHERE num_obra=OBRA001
数据库会把OBRA001当成一个列名,而不是字符串值,自然返回空结果,obraSelecionada保持为null,后续调用就触发空指针了。
修复方案:使用参数化查询(更安全,还能避免SQL注入)
把查询条件通过rawQuery的第二个参数传入,SQLite会自动处理字符串的引号:
Cursor cursor = db.rawQuery( "SELECT * FROM " + BancoDadosHelper.TABELA_OBRA + " WHERE " + BancoDadosHelper.COLUNA_NUM_OBRA + "=?", new String[]{filtro} );
2. 资源未正确关闭(潜在问题)
不管查询是否成功,你都需要关闭Cursor和SQLiteDatabase,否则会造成资源泄漏。建议用try-finally块确保资源被释放:
public Obra buscarInfoObra(String filtro) { if (filtro == null || filtro.trim().isEmpty()) { return null; // 先做参数校验,避免无效查询 } SQLiteDatabase db = helper.getReadableDatabase(); Cursor cursor = null; Obra obraSelecionada = null; try { cursor = db.rawQuery( "SELECT * FROM " + BancoDadosHelper.TABELA_OBRA + " WHERE " + BancoDadosHelper.COLUNA_NUM_OBRA + "=?", new String[]{filtro} ); if (cursor.moveToFirst()){ // 补全你的对象初始化逻辑 String numObra = cursor.getString(cursor.getColumnIndex(BancoDadosHelper.COLUNA_NUM_OBRA)); // 其他字段赋值... obraSelecionada = new Obra(numObra, ...); } } finally { // 确保Cursor和数据库连接被关闭 if (cursor != null) { cursor.close(); } db.close(); } return obraSelecionada; }
3. 调用方未做null判断(空指针的直接触发点)
你的方法本身允许返回null(当未找到匹配条目时),所以调用这个方法的代码必须先判断返回值是否为null,再进行后续操作:
Obra selecionada = buscarInfoObra("目标编号"); if (selecionada != null) { // 正常处理对象 System.out.println(selecionada.getNumObra()); } else { // 提示用户未找到对应条目 System.out.println("未找到该编号的作品"); }
额外建议:补全字段映射逻辑
从你贴的代码看,cursor.getString(...)后面的代码被截断了,确保你在cursor.moveToFirst()为true时,正确初始化Obra对象的所有必要字段,避免因为对象未完全初始化导致的其他问题。
内容的提问来源于stack exchange,提问作者José Henrique Firmino
相关产品推荐
相关产品推荐

