使用SQLite创建表时触发SQL语法错误异常的技术求助
排查SQLite语法错误的原因及解决办法
嘿,我来帮你揪出这段代码里的问题,核心就是SQL语句的语法漏洞导致了异常,咱们一步步拆解清楚:
错误原因分析
1. 建表语句末尾的多余逗号
你写的CREATE TABLE语句里,最后一个字段phrase ,后面多了个逗号,紧接着就是闭合的)——SQLite对这种多余的逗号零容忍,这正是你看到near ")": syntax error的直接诱因。
2. 字段定义不规范
publickey、phrase两个字段完全没指定数据类型:虽然SQLite是弱类型数据库允许这么写,但这是不规范的写法,很容易引发后续数据操作的问题。privetkey L明显有问题:L不是有效的SQLite数据类型,大概率是你打错了(比如想写TEXT或者BLOB来存储密钥);另外privetkey拼写错误,正确的应该是privatekey。
3. 插入语句的字符串未加引号
插入语句里的publickkeya没有用单引号包裹,SQLite会把它当成列名而非字符串值,执行时会报“列不存在”的错误。
解决办法
下面是修正后的完整代码,我标注了关键修改点:
void test() { ted++; try { Connection c = null; Class.forName("org.sqlite.JDBC"); c = DriverManager.getConnection("jdbc:sqlite:ted.db"); Statement stmt = null; stmt = c.createStatement(); String sql; // 修正:移除末尾多余逗号、补全字段类型、修正拼写错误 sql = "CREATE TABLE IF NOT EXISTS exchangesd (\n" + " id integer PRIMARY KEY,\n" + " name text,\n" + " publickey text,\n" + " privatekey text,\n" + " phrase text\n" + ");"; stmt.execute(sql); // 修正:给字符串值加单引号、修正字段拼写 sql = "INSERT INTO exchangesd (name, publickey, privatekey, phrase ) " + "VALUES ('exchangea', 'publickkeya', 'privet keya', 'phasea' );"; stmt.executeUpdate(sql); // 补充:记得关闭数据库资源,避免内存泄漏 stmt.close(); c.close(); }catch(Exception e) { ted++; e.printStackTrace(); // 建议打印异常堆栈,方便后续调试 } }
额外给你两个小建议:
- 数据库操作完成后一定要关闭
Statement和Connection,或者用try-with-resources语法自动关闭,避免资源泄漏。 - 捕获异常时别只做
ted++,打印堆栈信息能让你快速定位问题根源。
内容的提问来源于stack exchange,提问作者Ted pottel
相关产品推荐
相关产品推荐

