2013-11-26 2 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 - это объект класса i, который был опубликован первым. Он объявлен ранее в классе MySQLConnection conn = new MySQLConnection(); И да, извините за это. – 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

Спасибо, вы абсолютно правы. Я добавил printStackTrace в catch и действительно показывает ClassNotFoundException прямо там. Возможно, я импортировал что-то неправильно. Также научился всегда обрабатывать исключения вместо того, чтобы оставлять их пустым :) спасибо кучу! – Taerus

+0

Если это так, похоже, что ваша библиотека JDBC для MySQL не находится на правильном пути класса. Рад, что я могу помочь вам – hotforfeature

Смежные вопросы