NullPointerException при использовании executeQuery - PullRequest
0 голосов
/ 23 декабря 2010

У меня исключение нулевого указателя в

ResultSet rs = aStatement.executeQuery(Query); // it can't be executed 

мой код такой:

 public static boolean testLogin(String user, String password) throws SQLException {
    String Query = "select * from TBL_Users where userName = '" + user + "' and  passWord = '" + password + "' ";
    ResultSet rs = aStatement.executeQuery(Query);

    while (rs.next()) {

        info.Id = rs.getInt("ID");
        info.userName = rs.getString("userName");
        info.Name = rs.getString("User_Name");
        info.Password = rs.getString("passWord");
        info.isAdmin = rs.getBoolean("Admin");
        return true;
    }
    return false;
}

}

Ответы [ 5 ]

9 голосов
/ 23 декабря 2010

Скорее всего aStatement равно нулю.

6 голосов
/ 23 декабря 2010

Похоже, вы считаете, что aStatement не должен быть нулевым, но это так.

Это плохой код JDBC по многим причинам:

  1. Нет очистки ресурсов.
  2. Не использует PreparedStatement
  3. Сохраняет созданиеСтрока запроса снова и снова вместо использования статической переменной
  4. Не соответствует стандартам кодирования Java («Запрос» должен быть «запросом»)

Вот еще один способ написать это,Начните с интерфейса:

package persistence;

import java.sql.SQLException;

public interface CredentialDao
{
    boolean isValidUser(String username, String password) throws SQLException;
}

Напишите реализацию:

package persistence;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class CredentialDaoImpl implements CredentialDao
{
    private static final String CREDENTIAL_QUERY = "SELECT COUNT() FROM USER WHERE USERNAME = ? AND PASSWORD = ?";

    private Connection connection;

    public CredentialDaoImpl(Connection connection)
    {
        this.connection = connection;
    }

    public boolean isValidUser(String username, String password) throws SQLException
    {
        boolean isValidUser = false;

        PreparedStatement ps = null;
        ResultSet rs = null;

        try
        {
            ps = this.connection.prepareStatement(CREDENTIAL_QUERY);
            ps.setString(1, username);
            ps.setString(2, password);
            rs = ps.executeQuery();
            while (rs.next())
            {
                int count = rs.getInt(1);
                isValidUser = (count > 0);
            }
        }
        finally
        {
            DatabaseUtils.close(rs);
            DatabaseUtils.close(ps);
        }

        return isValidUser;
    }
}
1 голос
/ 23 декабря 2010

Переменная aStatement, по-видимому, null, проверьте, правильно ли она установлена.Вам следует прочитать Соглашения об именах Java и убедиться, что вы используете нижний регистр верблюдов для переменных и соглашений Java-бинов.

Для фрагментов кода в stackoverflow , если онине требуя пояснений, вы должны соблюдать правила SSCCE , это поможет вам получить больше и лучшие ответы.Также вы должны предоставить трассировку стека с произошедшим исключением.

0 голосов
/ 23 декабря 2010
 while (rs.next()) {

    info.Id = rs.getInt("ID");
    info.userName = rs.getString("userName");
    info.Name = rs.getString("User_Name");
    info.Password = rs.getString("passWord");
    info.isAdmin = rs.getBoolean("Admin");
    return true;       //                                Huh? What?
}

Что означает info и почему return сразу после назначения?

0 голосов
/ 23 декабря 2010

Использовать подготовленные заявления .

    Connection con = ...; // obtain connection here
    PreparedStatement pstmt = con.prepareStatement("select * from TBL_Users where userName = ?'");
    pstmt.setInt(1, userName);

    ResultSet rs = pstmt .executeQuery();
...
// do clean up here
...