关于java.sql.SQLException: 未调用 ResultSet.next的有关问题

求助关于java.sql.SQLException: 未调用 ResultSet.next的问题!
今天在练习注册登录功能的时候,发现了如下的问题:
每当我调用rs.setInt()的时候都提示java.sql.SQLException: 未调用 ResultSet.next,但是我明明调用了啊,代码如下。
PS:我用的是ORACLE11G+TOMCAT6+MYECLIPSE,连接数据库是写了个JdbcTools的JAVA文件来调用。

首先是JDBCTOOLS:
package tools;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;

/**
 * @author jdbc连接数据库的操作类
 *
 */
public class JdbcTools {
/*连接对象*/
private static Connection conn = null;
/*语句对象*/
private static Statement st = null;
/*结果集对象*/
private static ResultSet rs = null;
/**
 * @author jdbc数据库的方法
 *
 */
public  JdbcTools(){

String url = "jdbc:oracle:thin:@localhost:1521:orcl";//连接的数据库
try {

Class.forName("oracle.jdbc.driver.OracleDriver");

conn = DriverManager.getConnection(url, "sys as sysdba", "Oracle11g");//设置用户名,密码

st = conn.createStatement();

} catch (Exception e) {
e.printStackTrace();
}

}

/**
 * @author 添加,修改,删除数据库中记录的方法
 *
 */
public int update(String sql){

try{

return st.executeUpdate(sql);

}catch(SQLException e){

e.printStackTrace();

System.out.println("您所执行的语句有问题");

return 0;

}

}

/**
 * @author 查询数据库中记录的方法
 *
 */
public ResultSet search(String sql){

try{

rs = st.executeQuery(sql);

return rs;


}catch(SQLException e){

e.printStackTrace();
System.out.println("您所执行的语句有问题");

return null;

}

}
//批处理   一下处理一批
public int[] updateMore(LinkedList<String> sql){
try {
for (int j = 0; j < sql.size(); j++) {
st.addBatch(sql.get(j));
}
return st.executeBatch();
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}

/**
 * @author 关闭连接语句对象以及结果集对象的方法
 *
 */
public void colseAll(){

if(rs!=null){

try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}

}

if(st!=null){

try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}

}
if(conn!=null){

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();
}
}

}

}

然后是登录检验这里:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="tools.JdbcTools" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>登录验证</title>
    
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->

  </head>
  
  <body>
    <%
boolean success = false;//是否能够成功登录
    
    boolean valid = true;//是否重复登录了
    
    int id = 0;
    
    request.setCharacterEncoding("GBK");//设置编码为GBK

String username = request.getParameter("username");
    
    String password = request.getParameter("password");
    
    String sql = "select * from vip where username='" + username + "' and password='" + password + "'";
    
    JdbcTools l = new JdbcTools();//实例化对象
    l.search(sql);
 
if(l.search(sql).next()){
     success = true;
     id = l.search(sql).getInt("usernumber");
    }
    else
    {
     success = false;
    }
    
    
    //根据登录结果判断
    Vector UserList = (Vector)session.getAttribute("userlist");
    if(UserList == null){
     UserList = new Vector();
    }
    if(success){
     session.setAttribute("username",username);
     UserList.addElement(username);
     //判断是否重复登录
     for(int i=0;i<UserList.size()-1;i++){
     if(username.equals(UserList.elementAt(i).toString())){
     UserList.removeElement(username);
     valid = false;
     %>
     <h3>用户<%=username%>已经登录,请不要重复登录!</h3>
     <%
     }
     }
     if(valid){
     session.setAttribute("userlist",UserList);
     session.setAttribute("username",username);
     response.sendRedirect("index.jsp?id=" + String.valueOf(id));
     }
    }
    else
    {
    %>
    <h3>用户名或密码错误,请重新登录!</h3>
    <%
    }
    %>
    <a href="javascript:history.back();">返回</a>
  </body>
</html>

在中间的这一行id = l.search(sql).getInt("usernumber");
出错,提示未调用ResultSet.next,求大神指教!
------解决思路----------------------
public interface ResultSet extends Wrapper
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。 

ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next 方法将光标移动到下一行;因为该方法在 ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。 

l.search(sql).getInt("usernumber"); 楼主这里l.search(sql) 只是执行了查询,拿到了结果集,但是没有调用.next 方法,所以光标没有移动到第一行结果处,无法继续调用getInt("usernumber")
------解决思路----------------------

  l.search(sql);
  
 if(l.search(sql).next()){
      success = true;
      id = l.search(sql).getInt("usernumber");
     }

问题出在这里,你最开始使用  l.search(sql);查出结果集,为什么不用一个ResultSet来接收呢?
你下面确实使用了nest(),但你那个是又查询了一次:l.search(sql).next(),这里确实也nest了,但是你怎么下面又重新查询一次?
id = l.search(sql).getInt("usernumber");
你这样明显就是重新查询的,所以当然报没有调用nest了,正确的做法是:

ResultSet  resset = l.search(sql);
if(resset != null ) {
   while(resset .nest()) {
    success = true;
    id = resset.getInt("usernumber");
}
}