JDBC - 尝试插入值时出现NullPointerException

时间:2012-10-21 02:24:28

标签: java database ms-access jdbc nullpointerexception

我想在ms访问中为数据库表插入值。此代码之前有效,我无法理解为什么它现在会出现错误。

Exception in thread "main" java.lang.NullPointerException
at storeapp.Trylog.<init>(Trylog.java:28)
at storeapp.Trylog.main(Trylog.java:45)

我相信我正确配置了驱动程序。

我的表名为ACCOUNT,其中包含用户名和密码..

这是代码.....

public class Trylog extends JFrame{
Connection con;
Statement st;
ResultSet rs;

public Trylog(){
    connect();

    String u = "Katherine";
    String p = "kat";

    String sql = "Insert into ACCOUNT(Username, Password) Values ('"+u+"' , '"+p+"' ) ";
    try {
        rs = st.executeQuery(sql);
    } catch (SQLException ex) {
    }
}

public void connect(){
    try {
            String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
             Class.forName(driver);
             String db = "jdbc:odbc:access";
             con = DriverManager.getConnection(db);
             st = con.createStatement();
    }
    catch (Exception ex){}
}

public static void main(String[] args) {
    Trylog r = new Trylog();
    r.setVisible(true);
    r.setSize(600, 800);
    r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

有谁知道为什么我会收到这样的错误?

这是导致第28和46行的异常基础的行

rs = st.executeQuery(sql);

 Trylog r = new Trylog();

打印

Exception in thread "main" java.lang.RuntimeException: java.sql.SQLException: No ResultSet was produced

引起:java.sql.SQLException:没有生成ResultSet

3 个答案:

答案 0 :(得分:3)

您的具体问题是由错误的异常处理引起的(甚至更多,根本没有没有异常处理)。你有捕获完全吞下异常的块,例如:

catch (Exception ex){}

这样,代码继续在异常情况下运行,可能会使try块中的变量(如st未初始化)。之后,访问了那些未初始化的(即它们仍然是null)个变量,这反过来导致了NullPointerException

这不应该发生。捕获异常时,代码应该正确处理它。在这种情况下,它应该立即停止并以某种方式显示错误详细信息。此时,最简单的方法是将其重新抛出为运行时异常,以便至少获得有关该问题的所有必要信息:

catch (Exception ex) { 
    throw new RuntimeException(ex);
}

(您可以通过记录堆栈跟踪并显示一些用户友好的消息对话框然后退出程序来改进此功能)

抛出的异常基本上是解决问题根本原因的全部答案。艺术是能够解释和理解堆栈跟踪。


根据您的更新

更新,您有

java.sql.SQLException: No ResultSet was produced

看,有你的答案!对于给定的查询,根本没有生成ResultSet,而您预计会生成它。实际上,INSERT查询不会返回结果集。它将在最高回报率下受影响的行数。

您需要替换

rs = st.executeQuery(sql);

通过

st.executeUpdate(sql);

另请参阅the executeQuery() javadocthe executeUpdate() javadoc。它们准确地告诉应该使用哪种SQL语句。

  

的executeQuery

     

执行给定的SQL语句,该语句返回单个ResultSet对象。

     

<强>参数:   sql - 要发送到数据库的SQL语句,通常是静态SQL SELECT语句

  

的executeUpdate

     

执行给定的SQL语句,该语句可以是INSERT,UPDATE或DELETE语句,也可以是不返回任何内容的SQL语句,例如SQL DDL语句。

     

<强>参数:   sql - SQL数据操作语言(DML)语句,例如INSERTUPDATEDELETE;或者什么都不返回的SQL语句,例如DDL语句。

答案 1 :(得分:1)

您的代码未指定要连接的数据库。因此错误。尝试在所有catch块中打印堆栈跟踪,您将看到。

答案 2 :(得分:1)

您的代码正常工作但唯一的问题是在dsn配置中您可能会更改访问文件位置。重新配置dsn。我没有任何修改地使用相同的代码。只是我用两列用户名,密码创建了访问数据库表帐户。