插入本地数据库时发生Java空指针异常
我正在尝试将用户名添加到.accdb本地数据库中。我的代码如下:插入本地数据库时发生Java空指针异常,java,sql,jdbc,nullpointerexception,Java,Sql,Jdbc,Nullpointerexception,我正在尝试将用户名添加到.accdb本地数据库中。我的代码如下: try { String sql = "INSERT INTO Users VALUES('?');"; System.out.println("SQL : " + sql); System.out.println("USER : " + user); PreparedStatement stmt = database.prepareStatement(s
try
{
String sql = "INSERT INTO Users VALUES('?');";
System.out.println("SQL : " + sql);
System.out.println("USER : " + user);
PreparedStatement stmt = database.prepareStatement(sql);
System.out.println("Statement : " + stmt);
stmt.setString(1, user);
System.out.println("Statement : " + stmt);
ResultSet results = stmt.executeQuery();
System.out.println("Results : " + results);
}
catch(SQLException sqlEx)
{
System.out.println("* Cannot execute insertion! *");
sqlEx.printStackTrace();
System.exit(1);
}
控制台输出为:
SQL : INSERT INTO Users VALUES('?');
USER : TEST
Statement : sun.jdbc.odbc.JdbcOdbcPreparedStatement@1bf73fa
Exception in thread "Thread-0" java.lang.NullPointerException
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.clearParameter (JdbcOdbcPreparedStatement.java:1023)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setChar (JdbcOdbcPreparedStatement.java:3057)
at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setString (JdbcOdbcPreparedStatement.java:766)
at MultiEchoServer.addRegisteredUser(MultiEchoServer.java:100)
at ClientHandler.run(MultiEchoServer.java:339)
谢谢你的帮助 我想这就是问题所在:
String sql = "INSERT INTO Users VALUES('?');";
该语句没有任何参数-它将始终插入问号,因为在引号中有它,所以它是一个值而不是一个参数。我想你想要:
String sql = "INSERT INTO Users VALUES(?)";
(请注意,我也删除了SQL语句末尾额外的分号——我不相信您真的想要这样做。)
不幸的是,不可否认,例外情况并没有更大的帮助。。。我希望有东西表明索引1超出范围。我怀疑这就是问题所在:
String sql = "INSERT INTO Users VALUES('?');";
该语句没有任何参数-它将始终插入问号,因为在引号中有它,所以它是一个值而不是一个参数。我想你想要:
String sql = "INSERT INTO Users VALUES(?)";
(请注意,我也删除了SQL语句末尾额外的分号——我不相信您真的想要这样做。)
不幸的是,不可否认,例外情况并没有更大的帮助。。。我希望有东西表明索引1超出范围。删除引号和分号:
String sql = "INSERT INTO Users VALUES(?)";
删除引号和分号:
String sql = "INSERT INTO Users VALUES(?)";
查看堆栈跟踪并找出第339行上的引用为NULL的原因。而且,它是“Java”而不是“Java”。@Corbin:)你知道,你有编辑权限。@Lion是的,我已经编辑过了。我只是想明确指出这一点,让提问者更容易注意到。我不知道为什么,但我最近注意到,大约40%的Java问题都将Java样式化为“Java”(出于某种原因,它让我非常讨厌)。查看堆栈跟踪,找出第339行上的引用为空的原因。而且,它是“Java”而不是“Java”。@Corbin:)你知道,你有编辑权限。@Lion是的,我已经编辑过了。我只是想明确指出这一点,让提问者更容易注意到。我不知道为什么,但我最近注意到,大约40%的Java问题都将Java样式化为“Java”(出于某种原因,它让我非常讨厌)。我想说SQL结尾的分号不重要,但我也希望PreparedStatement类能够更优雅地处理无效的参数绑定,并抛出一个有用的异常,所以我真的不能确定这一点。验证和异常处理的正确性取决于JDBC驱动程序make/version。JDBC-ODBC桥驱动程序确实属于最差的驱动程序。不仅在异常处理方面……我想说SQL末尾的分号不重要,而且我还希望使用PreparedStatement类更优雅地处理无效参数绑定并抛出有用的异常,所以我真的不能确定,验证和异常处理的正确性取决于JDBC驱动程序的make/version。JDBC-ODBC桥驱动程序确实属于最差的驱动程序。不仅在异常处理领域。。。