如何处理java sql异常:耗尽的结果集

如何处理java sql异常:耗尽的结果集,java,jdbc,resultset,Java,Jdbc,Resultset,我对下面的代码有问题。救救我 Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe","system","**********"); Statement st=conn.createStatement(); String sql="select passwor

我对下面的代码有问题。救救我

    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe","system","**********");
    Statement st=conn.createStatement();
    String sql="select password from db where username='user'";
    ResultSet rs=st.executeQuery(sql);
    rs.next();
    String password=rs.getString("password");
    if(password.equals(pass))
    {       
        RequestDispatcher rd=req.getRequestDispatcher("/home.jsp");
        rd.forward(req,res);
    }
    else
    {
        out.println("invalid username and password");
    }

当我执行这段代码时,我得到一个JavaSQL异常:耗尽的结果集。提前感谢…

而不是使用
rs.next()
,与while一起使用,例如
while(rs.next())
。一旦获得结果集,指针将指向第一条记录。每次执行
rs.next()
,指针将前进到下一条记录。如果与while一起使用,一旦到达结果集的末尾,
rs.next()
将在迭代所有记录后返回false。在您的情况下,由于您没有检查resultset是否已耗尽并尝试提升指针,因此会出现异常。

而不是使用
rs.next()
,与while一起使用,例如
while(rs.next())
。一旦获得结果集,指针将指向第一条记录。每次执行
rs.next()
,指针将前进到下一条记录。如果与while一起使用,一旦到达结果集的末尾,
rs.next()
将在迭代所有记录后返回false。在您的情况下,由于您没有检查resultset是否已耗尽并尝试提升指针,因此出现了异常。

这是正确的,因为如果输入错误的用户名或密码,将不会返回任何记录。因此,当您使用
rs.next()时
在本例中,它试图访问空结果集的第一行

 String password=rs.getString("password");//error, if rs is empty
where
子句中,您没有使用
user
变量

where
子句应该是
where username='“+user+”;

而不是

rs.next();
使用


这是正确的,因为如果输入错误的用户名或密码,将不会返回任何记录。因此,在本例中,当您使用
rs.next();
时,它将尝试访问空结果集的第一行

 String password=rs.getString("password");//error, if rs is empty
where
子句中,您没有使用
user
变量

where
子句应该是
where username='“+user+”

而不是

rs.next();
使用


您正在查找用户名为
user
的行-您从未使用
user
变量。因此,没有匹配的行,因此
rs.next()
返回false,但您忽略了这一点,并从该行读取数据。(您应该使用参数化SQL-但也不应该在这样的数据库中存储密码…)您正在查找用户名为
user
的行-您从未使用
user
变量。因此,没有匹配的行,因此
rs.next()
返回false,但您忽略了这一点,并从该行读取数据。(您应该使用参数化SQL,但也不应该像这样在数据库中存储密码…)