2009-06-21 100 views
1

我有一個方法......,我無法找到錯誤:爲什麼我從這個Java代碼中得到一個空指針異常?

public String getUsernameforID(int id) { 
    String statment = "SELECT USERNAME FROM `BENUTZER` WHERE `ID` = ? ;"; 
    String username = null; 
    try { 
     PreparedStatement ps = dbCommunicator.getStatment(statment); // HERE : NULL POINTER EXECTION 
     ps.setInt(1, id); 
     ResultSet rs = dbCommunicator.readFromDB(ps); 

     if (rs.first()) { 
      username = rs.getString("USERNAME"); 
     } 
    } catch (SQLException ex) { 
     Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return username; 

我認爲這是該語句......但我怎麼能發現這一點? 我得到一個空指針執行。

編輯: 我getStatment法:

public PreparedStatement getStatment(String st) { 
    connect(); 
    PreparedStatement ps = null; 
    try { 
     ps = (PreparedStatement) connection.prepareStatement(st); 
    } catch (SQLException ex) { 
     Logger.getLogger(DBCommunicator.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return ps; 
    } 

例外:

Exception in thread "main" java.lang.NullPointerException 
    at test.DBCommunicator.getStatment(DBCommunicator.java:107) 
    at test.database.DBManager.getUsernameforID(DBManager.java:359) 
    at dbtestdrive.Main.main(Main.java:25) 
+0

哪個db你在用? – Macarse 2009-06-21 13:02:17

+0

我正在使用mySQL – darkrain 2009-06-21 13:09:01

回答

5

雖然這個問題可能已經解決了,但是有一點關於如何在給定堆棧跟蹤的情況下進行調試。

在這種情況下,堆棧跟蹤如下:

Exception in thread "main" java.lang.NullPointerException 
    at test.DBCommunicator.getStatment(DBCommunicator.java:107) 
    at test.database.DBManager.getUsernameforID(DBManager.java:359) 
    at dbtestdrive.Main.main(Main.java:25) 

什麼這說明的是,在test.DBCommunicator.getStatment法,NullPointerException在的DBCommunicator.java 107線的位置拋出。

另外,getStatment方法從DBManager.java的行358調用,該行在DBManager.getUsernameforID方法中。

因此,應該檢查的第一個地方是DBCommunicator.java第107行的內容。

雖然有代碼片段給出代碼中沒有行號,可以假定一個NullPointerException發生在下面一行:

ps = (PreparedStatement) connection.prepareStatement(st); 

有一兩件事是很常見約NullPointerException秒 - 它們通常出現當方法調用在null參考上執行時。在不存在的對象上調用方法將會拋出一個NullPointerException

在上面的代碼中,可以預期connection變量實際上是null,而不是Connection

這應該導致嘗試追查爲什麼connection變量是null而不是有一個有效的連接到初始化的數據庫。

1

很可能是因爲您的查詢失敗,請嘗試將其更改爲:

String statment = "SELECT USERNAME FROM `BENUTZER` WHERE `ID` = ?"; 

你原來的查詢有一個尾隨的分號,這是非法的。這可能會導致在以後的階段拋出一個nullpointerexception,我會建議你發佈你的異常的內容。

編輯:

dbCommunicator.getStatment(statment); 

應該是:

dbCommunicator.getStatement(statment); 

提到的方法,當你的拼寫錯誤 '聲明' 作爲 'statment',這是罰款變量名,但不:)

0
//Ending ";" inside the string, is not neccessary. 
String statment = "SELECT USERNAME FROM `BENUTZER` WHERE `ID` = ? ;"; 

相反的:

PreparedStatement ps = dbCommunicator.getStatment(statment); 

PreparedStatement ps = dbCommunicator.prepareStatement(statment); 

這就是我使用的oracle。

相關問題