9
public UserBean authenticate(String username,String password){
    PostGresDAO pg=new PostGresDAO();   //creates new connection
    Connection conn=pg.getConnecion();  //return connection object
    PreparedStatement ps;
    ResultSet rs;
    String query="select password,name from scg_users where username=?";
    UserBean ub=null;
    boolean authenticated=false;
    try{
        ps=conn.prepareStatement(query);
        ps.setString(1, username);
        rs=ps.executeQuery();

        if(rs!=null){

            authenticated=password.equals(rs.getString(1));  //exception raised here
            if(authenticated){
                ub=new UserBean();
                ub.setUser(rs.getString(2));
                ub.setUsername(username);
            }
        }
    }
    catch(SQLException e){
        e.printStackTrace();
    }
    return ub;
}

このコードを使用してユーザーを認証しています。ユーザー名とパスワードはリクエストパラメータから抽出され、認証のためにこのメソッドに渡されます。しかし、それはスローします:

org.postgresql.util.PSQLException: ResultSet not positioned properly, perhaps you need to call next.

ご意見をお聞かせください。

4

4 に答える 4

23

エラーは、何が問題なのかを正確にnext()示しています。結果の最初の行に到達するためにResultSetを呼び出していません。

この行:

if(rs!=null)

私の知る限り無意味です。executeQuerynullが返されるとは思わない。クエリに問題がある場合は、例外がスローされます。結果がない場合は、空の結果セットが返されます。行があるかどうかを確認するには、呼び出しnext()て戻り値を確認する必要があります。

if (rs.next())

さらに:

  • 例外をキャッチし、再スローせずにスタックトレースを出力することは、ほとんどの場合、間違ったアプローチです。
  • あなたのコードは、パスワードをプレーンテキストで保存していることを示唆しています。しないでください。本当に、本当にしないでください。
于 2012-08-24T06:06:58.843 に答える
3

next()電話をかけてもメッセージが届いたのでresultSet、解決策を教えます。

解決策は、それが空の場合resultSet.get*にあなたを呼び出すことではありません。resultSetだからチェックしてくださいif(resultSet.next()){ ...

于 2014-10-16T14:25:26.013 に答える
1

それ以外の

if(rs!=null)

あなたはチェックする必要があります

if(rs.next())

一致する行がある場合、これは最初の行を返します。

于 2012-08-24T06:14:42.590 に答える
0

多分あなたはresultSet.next()デバッガーインラインウォッチを持っています:)

それは私の場合でした。したがって、チェックif (resultSet.next())はtrueを返しますが、ifブロック内に入ると、next()が再度呼び出され、データがないため、同じエラーメッセージが表示されます。

于 2021-10-21T15:11:24.813 に答える