簡體   English   中英

JDBC-嘗試插入值時出現NullPointerException

[英]JDBC - NullPointerException when trying to insert values

我想將值插入通過ms access訪問的數據庫表中。 這段代碼以前有效,我現在不明白為什么會出錯。

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

您的具體問題是由錯誤的異常處理引起的(甚至,根本沒有異常處理)。 您有可以完全吞沒異常的catch塊,例如:

catch (Exception ex){}

這樣,代碼繼續在異常情況下運行,可能留在變量try塊,如st初始化。 之后,將訪問那些未初始化的變量(即它們仍為null ),這又導致NullPointerException

這不應該發生。 當捕獲到異常時,代碼應正確處理它。 在這種情況下,它應該立即停止並以某種方式顯示錯誤詳細信息。 目前,最簡單的方法是將其作為運行時異常重新拋出,以便至少獲得有關該問題的所有必要信息:

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

(例如,您始終可以通過記錄stacktrace並顯示一些用戶友好的消息對話框,然后退出程序來改善此問題)

引發的異常基本上是問題根源的完整答案。 技術是能夠解釋和理解堆棧跟蹤。


更新按照您的更新,你有

java.sql.SQLException: No ResultSet was produced

看,有您的答案! 對於給定的查詢,根本沒有生成ResultSet ,但是您希望生成它。 確實, INSERT查詢不會返回結果集。 它將最高返回受影響的行數。

您需要更換

rs = st.executeQuery(sql);

通過

st.executeUpdate(sql);

另請參見executeQuery() javadocexecuteUpdate() javadoc 他們精確地指出了該方法應用於哪些SQL語句。

的executeQuery

執行給定的SQL語句,該語句返回一個ResultSet對象。

參數sql要發送到數據庫的SQL語句,通常是靜態SQL SELECT語句

的executeUpdate

執行給定的SQL語句,該語句可以是INSERT,UPDATE或DELETE語句,也可以是不返回任何內容的SQL語句,例如SQL DDL語句。

參數sql -SQL數據操作語言(DML)語句,例如INSERTUPDATEDELETE 或不返回任何內容的SQL語句,例如DDL語句。

您的代碼未指定要連接的數據庫。 因此,錯誤。 嘗試在所有catch塊中打印堆棧跟蹤,您將看到。

您的代碼有效,但唯一的問題是在dsn配置中,您可以更改訪問文件的位置。 重新配置dsn。 我使用相同的代碼,沒有任何修改。 只是我創建了具有兩列用戶名,密碼的訪問數據庫表帳戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM