2012-04-17 131 views
1

我正在嘗試將用戶名添加到.accdb本地數據庫中。我的代碼如下:Java空指針插入本地數據庫時出現異常

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 : [email protected] 
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) 

感謝您的幫助!

+0

看堆棧跟蹤並找出原因線339的基準爲NULL。另外,它是'Java'而不是'JAVA'。 – Corbin 2012-04-17 21:19:57

+0

@Corbin :)你有編輯權限,你知道。 – Lion 2012-04-17 21:21:15

+1

@Lion是的,我已經編輯它。我只是想明確指出,所以提問者更可能注意到。我不知道爲什麼,但最近我注意到約有40%的Java問題將Java程式化爲'JAVA'(並且由於某種原因,它讓我感到不知所措)。 – Corbin 2012-04-17 21:22:20

回答

11

這是問題,我懷疑:

String sql = "INSERT INTO Users VALUES('?');"; 

這種說法並不任何參數 - 它總是插入一個問號,因爲你在引號了它,因此它是一個而不是參數。我想你想:

String sql = "INSERT INTO Users VALUES(?)"; 

(請注意,我已經刪除的SQL語句的末尾額外的分號太 - 我不相信你真的希望這樣。)

這是不幸的這個例外不是更有幫助,但我承認...我希望有某些東西表明索引1超出範圍。

+0

我要說的是,在SQL末尾的分號應該不重要,但我也希望PreparedStatement類用於處理無效的參數綁定更優雅,並拋出一個有用的異常,所以我真的不確定。 – 2012-04-17 21:29:28

+3

您依賴於JDBC驅動程序make/version來驗證和異常處理的正確性。 JDBC-ODBC橋驅動程序確實屬於最差的。不僅在異常處理方面... – BalusC 2012-04-17 21:30:41

6

刪除引號和分號:

String sql = "INSERT INTO Users VALUES(?)"; 
相關問題