try/catch语句中while循环失效,SQLite连接及ResultSet遍历报错求助
解决SQLite数据库连接与ResultSet遍历报错问题
兄弟,我太懂这种卡在数据库连接上的憋屈了——你正忙着搞适配DHL的履约中心应用,结果连个测试程序都卡在while(rs.next())这步,换谁都头大!结合SQLite JDBC的常见坑,我给你梳理几个排查方向,再给个完整的测试代码参考:
先排查最容易踩的几个坑
1. 确认SQLite JDBC驱动已正确导入
这是新手最常犯的错误:
- 如果你手动管理依赖:去SQLite官方下载最新的
sqlite-jdbc-x.x.x.jar,在Eclipse里右键项目 → Build Path → Add External Archives,选中这个jar包。 - 用Maven的话,直接在
pom.xml里加依赖:<dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.45.2.0</version> <!-- 替换成最新版本 --> </dependency>
2. 核对数据库连接字符串
SQLite的JDBC URL格式和其他数据库不一样,别写错了:
- 绝对路径(推荐,避免路径混乱):
jdbc:sqlite:C:/Users/YourName/Projects/dhl_fulfillment.db(Windows用正斜杠或双反斜杠) - 相对路径(数据库文件在Eclipse项目根目录):
jdbc:sqlite:dhl_fulfillment.db - 内存测试库(重启程序数据就没了,适合快速测试):
jdbc:sqlite::memory:
3. 检查代码里的资源顺序与SQL语法
- 别提前关闭资源:如果在
while(rs.next())之前就关了Statement或Connection,ResultSet会直接失效报错。一定要在遍历完结果集后,或者在finally块里统一关闭资源。 - SQL语句要准确:确保你查询的表名、字段名和数据库里的一致,SQLite大小写不敏感,但最好和建表语句保持一致,避免拼写错误。
- 打印异常详情:把
catch块里的异常栈信息打出来(比如e.printStackTrace()),这能直接告诉你是驱动找不到、连接失败还是SQL语法错了,比只说“报错”有用100倍!
给你一个可运行的完整测试代码
你可以把这个代码复制到Eclipse里跑,对比自己的代码找差异:
package test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class SQLiteFulfillmentTest { public static void main(String[] args) { // 这里用相对路径,数据库文件会生成在你的Eclipse项目根目录 String dbUrl = "jdbc:sqlite:dhl_fulfillment_test.db"; Connection conn = null; Statement stmt = null; ResultSet rs = null; try { // 加载驱动(新版JDBC可省略,但兼容旧环境建议加上) Class.forName("org.sqlite.JDBC"); // 建立连接 conn = DriverManager.getConnection(dbUrl); System.out.println("✅ 成功连接到SQLite数据库!"); // 创建一个测试用的运单表(如果不存在) String createTableSql = "CREATE TABLE IF NOT EXISTS shipments (" + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "tracking_number TEXT NOT NULL, " + "carrier TEXT NOT NULL, " + "status TEXT DEFAULT 'pending')"; stmt = conn.createStatement(); stmt.executeUpdate(createTableSql); System.out.println("✅ 测试表已创建/存在"); // 插入一条DHL测试数据 String insertSql = "INSERT INTO shipments (tracking_number, carrier) VALUES ('DHL-987654', 'DHL')"; stmt.executeUpdate(insertSql); // 查询数据并遍历结果集 String querySql = "SELECT * FROM shipments"; rs = stmt.executeQuery(querySql); // 这里就是你报错的while循环,看看能不能正常运行 System.out.println("\n📋 查询到的运单数据:"); while (rs.next()) { int id = rs.getInt("id"); String trackingNum = rs.getString("tracking_number"); String carrier = rs.getString("carrier"); String status = rs.getString("status"); System.out.printf("ID: %d | 运单号: %s | 承运商: %s | 状态: %s%n", id, trackingNum, carrier, status); } } catch (ClassNotFoundException e) { System.err.println("❌ 找不到SQLite驱动!请确认jar包已导入:"); e.printStackTrace(); } catch (SQLException e) { System.err.println("❌ 数据库操作出错:"); e.printStackTrace(); } finally { // 务必关闭所有资源,避免内存泄漏 try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
你先跑这个测试代码,如果能正常运行,再对比自己的代码找差异;如果还是报错,把控制台打印的异常信息贴出来,我再帮你针对性解决!
内容的提问来源于stack exchange,提问作者Taylor Simmz Jacobs
相关产品推荐
相关产品推荐

