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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:17:47