2013-11-26 23 views
0

我目前正在被我的學校扔進深處,他們期待着我使用sql編程一個簡單的登錄表單。他們給了我們關於他們如何使用JDBC以及它是什麼的簡要例子,但是並沒有真正解釋如何獨立使用它。因此,我從示例中抓取了一些代碼,但我無法使其工作。我不斷收到一個NullPointerException異常,我無法弄清楚,爲什麼:(簡單的數據與MySQL的比較,nullpointerexception

這裏是連接類:

package Database; 

import java.sql.*; 

public class MySQLConnection { 

    public static final String DRIVER = "com.mysql.jdbc.Driver"; 
    public static final String DBURL = "jdbc:mysql://localhost/corendon"; 
    public static final String DBUSER = "root"; 
    public static final String DBPASS = "simplepass"; 
    private ResultSet result = null; 
    private int affectedRows = -1; 
    Connection conn = null; 

    public void startConnection() { 
     try { 

      Class.forName(DRIVER); 
      DriverManager.setLoginTimeout(5); 
      conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); 

     } catch (Exception e) { 
     } 
    } 

    public void closeConnection() { 
     try { 
      if (conn != null && !conn.isClosed()) { 
       conn.close(); 
      } 
     } catch (Exception e) { 
     } 
     conn = null; 
    } 

    public ResultSet performSelect(PreparedStatement prdstmt) throws SQLException { 
     result = prdstmt.executeQuery(); 

     return result; 
    } 

    public int performUpdate(PreparedStatement prdstmt) throws SQLException { 

     affectedRows = prdstmt.executeUpdate(); 

     return affectedRows; 
    } 

    public Connection getConnection() { 
     return conn; 
    } 
} 

這裏是我得到的例外(在不同的類)的方法:

MySQLConnection conn = new MySQLConnection(); 

public void compareData(int id, String pass) throws SQLException{ 
    ResultSet rs = null; 
    PreparedStatement prdstmt = null; 

    String query = "SELECT id, password FROM users WHERE id=?, password=?"; 

    conn.startConnection(); 

    prdstmt = conn.getConnection().prepareStatement(query); 
    prdstmt.setInt(1, id); 
    prdstmt.setString(2, pass); 

    rs = conn.performSelect(prdstmt); 

    while (rs.next()){ 
     String tempPass = rs.getString("password"); 
     int tempId = rs.getInt("id"); 
    } 

    if(conn != null){ 
     conn.closeConnection(); 
    } 
} 

我得到上線NullPointerException異常:

prdstmt = conn.getConnection().prepareStatement(query); 

爲什麼我t拋出一個異常,但不是當我開始連接,並且我該如何解決這個問題?提前致謝。

+0

在你的compareData方法中,變量'conn'是什麼類型的對象?它聲明瞭一個方法startConnection(),雖然'DataSource'和'Connection'對象都沒有那個 – hotforfeature

+0

您使用的是SQL Server還是MySQL?你的問題標題說SQL Server,但你的問題的其餘部分說MySQL。 –

+0

conn是我第一次發佈的課程的一個對象。它在MySQLConnection類的早期聲明conn = new MySQLConnection();是的,我對MySQL感到抱歉。 – Taerus

回答

0

當調用startConnection(),你因此拋出Exception

public void startConnection() { 
     try { 

      Class.forName(DRIVER); 
      DriverManager.setLoginTimeout(5); 
      conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); 

     } catch (Exception e) { 
      //An exception occurs here, but you don't do anything about it 
     } 
    } 

,當調用的getConnection()時,conn變量仍然null,其投擲NullPointerException

要麼讓startConnection()拋出一個異常,讓你不得不處理它(這通常是最JDBC驅動程序反正是如何工作的),或檢查,看看是否conn變量是null你開始使用它之前。

public void compareData(int id, String pass) throws SQLException{ 
    ResultSet rs = null; 
    PreparedStatement prdstmt = null; 

    String query = "SELECT id, password FROM users WHERE id=?, password=?"; 

    conn.startConnection(); 

    if (conn.getConnection() == null) { 
     throw new SQLException("Connection is null!"); 
    } 

或(我認爲會親自更好)

public void startConnection() throws Exception { 
      Class.forName(DRIVER); 
      DriverManager.setLoginTimeout(5); 
      conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS); 
    } 

public void compareData(int id, String pass) throws SQLException{ 
     ResultSet rs = null; 
     PreparedStatement prdstmt = null; 

     String query = "SELECT id, password FROM users WHERE id=?, password=?"; 

     try { 
      conn.startConnection(); 
     } catch (Exception e) { 
      throw new SQLException(e); 
     } 

而且作爲小費,你應該避免聲明你爲其它類同名您使用。這一切都發生在你自己的MySQLConnection課程中,但這可能會與實際的com.mysql.jdbc.MySQLConnection課程混淆。

+0

非常感謝你,你是對的。我在catch上添加了printStackTrace,並且確實在那裏顯示了一個ClassNotFoundException。我可能導入了錯誤的東西。也學會了總是處理例外,而不是留下空白:)謝謝一堆! – Taerus

+0

如果是這樣,這聽起來像你的MySQL JDBC庫不在正確的類路徑。很高興我能幫助你 – hotforfeature