0

我想在 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:没有生成结果集

4

3 回答 3

3

您的具体问题是由错误的异常处理引起的(甚至根本没有异常处理)。你有完全吞没异常的 catch 块,比如这里:

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);

executeQuery()参阅javadocjavadoc executeUpdate()它们准确地说明了该方法应该用于哪些 SQL 语句。

执行查询

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

参数sql- 要发送到数据库的 SQL 语句,通常是静态 SQLSELECT语句

执行更新

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

参数sql- SQL 数据操作语言 (DML) 语句,例如INSERTUPDATEDELETE;或不返回任何内容的 SQL 语句,例如 DDL 语句。

于 2012-10-21T02:32:24.593 回答
1

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

于 2012-10-21T02:30:01.473 回答
1

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

于 2013-02-13T06:25:23.570 回答