插入本地数据库时发生Java空指针异常

插入本地数据库时发生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

我正在尝试将用户名添加到.accdb本地数据库中。我的代码如下:

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桥驱动程序确实属于最差的驱动程序。不仅在异常处理领域。。。