SQLite JDBC问题:调用ResultSet.getString()始终返回NULL
问题排查与解决
可能的原因及对应解法
1. 列名拼写/大小写不匹配
SQLite虽默认大小写不敏感,但如果创建表时用引号强制区分大小写,就会导致列名匹配失败。可以先尝试用列索引获取值:
System.out.println(rs.getString(1));
如果能正常输出内容,说明"title"这个列名拼写或大小写有问题,核对数据库表的实际列名即可。
2. 结果集遍历不完整
你只调用了一次rs.next(),如果第一行数据本身为null,或者需要查看所有行数据,应该用循环遍历结果集:
while (rs.next()) { System.out.println(rs.getString("title")); }
这样能确认所有行的title字段值,避免仅查看单行导致的误判。
3. 数据库或表的指向错误
确认你连接的test.db确实是包含Movies表的目标数据库文件:
- 用SQLite可视化工具打开该文件,执行
SELECT * FROM Movies手动验证数据是否存在,列名是否为title。 - 检查数据库文件路径是否正确,避免连接到了空的或其他版本的
test.db。
4. SELECT *带来的隐式问题
替换SELECT *为明确指定列名的查询,避免列顺序或别名导致的取值异常:
ResultSet rs = stmt.executeQuery("SELECT title FROM Movies");
5. 资源管理优化
改用try-with-resources自动管理数据库资源,避免资源泄漏影响结果:
import java.sql.*; public class Driver { public Driver() { try (Connection c = DriverManager.getConnection("jdbc:sqlite:test.db"); Statement stmt = c.createStatement(); ResultSet rs = stmt.executeQuery("SELECT title FROM Movies")) { while (rs.next()) { System.out.println(rs.getString("title")); } } catch(Exception e) { e.printStackTrace(); } } }
验证步骤
- 执行
PRAGMA table_info(Movies);查看Movies表的结构,确认列名、数据类型是否符合预期。 - 手动执行
SELECT * FROM Movies;,确认title列存在非null数据。 - 替换
rs.getString("title")为rs.getString(1)测试,判断是否是列名匹配问题。
内容的提问来源于stack exchange,提问作者anathrax
相关产品推荐
相关产品推荐

