![](/img/trans.png)
[英]NullPointerException when trying to insert into SQLite - Android
[英]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()
javadoc和executeUpdate()
javadoc 。 他們精確地指出了該方法應用於哪些SQL語句。
的executeQuery
執行給定的SQL語句,該語句返回一個
ResultSet
對象。參數 :
sql
要發送到數據庫的SQL語句,通常是靜態SQLSELECT
語句
的executeUpdate
執行給定的SQL語句,該語句可以是INSERT,UPDATE或DELETE語句,也可以是不返回任何內容的SQL語句,例如SQL DDL語句。
參數 :
sql
-SQL數據操作語言(DML)語句,例如INSERT
,UPDATE
或DELETE
; 或不返回任何內容的SQL語句,例如DDL語句。
您的代碼未指定要連接的數據庫。 因此,錯誤。 嘗試在所有catch塊中打印堆棧跟蹤,您將看到。
您的代碼有效,但唯一的問題是在dsn配置中,您可以更改訪問文件的位置。 重新配置dsn。 我使用相同的代碼,沒有任何修改。 只是我創建了具有兩列用戶名,密碼的訪問數據庫表帳戶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.