警告:java.lang.IndexOutOfBoundsException

时间:2011-08-05 14:31:49

标签: java hibernate web-applications hql

调用以下函数时出错。 HQL查询函数从数据库下载数据,但不幸的是我收到错误:

java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
    at java.util.ArrayList.RangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at com.example.server.RaportGenerator.checkParam(RaportGenerator.java:103)
    at com.example.server.RaportGenerator.doGet(RaportGenerator.java:58)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:324)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:829)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:513)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)

这是我的职责:

protected boolean checkParam(String login, String sid) {
    boolean result = false;
    List listOfData;
    try {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Query query = session.createQuery("Select u.login, u.sid from User u Where u.login = :login");
        query.setParameter("login",login);
        listOfData = query.list();
        String sidDb = listOfData.get(1).toString();
        if (sid == sidDb) {
            result = true;  
        }
        session.close();
    } catch (HibernateException e) {
        e.printStackTrace();
    }
    return result;
}

RaportGenerator.java:103 is:


String sidDb = listOfData.get(1).toString();

3 个答案:

答案 0 :(得分:4)

此代码存在多个问题:

  • 你要的是元素1,这是第二个元素。我怀疑你实际上是get(0)来获取第一个元素。
  • 如果用户的登录不存在,那仍然会失败,当然......你应该首先使用listOfData.size()进行检查。
  • 您不需要result变量 - 只需在知道答案时返回。
  • listOfData变量可以在更严格的范围内声明,这通常是一种很好的做法。
  • 您应该可能finally块中关闭会话,而不是我记得的。
  • 您不应该使用==测试字符串相等。
  • 您可能不应该在代码中捕获HibernateException,即使您执行,也应该使用更好的日志记录机制。

这是一个代码示例,其中大部分都已清理完毕。

protected boolean checkParam(String login, String sid) {
    Session session = null;
    try {
        session = HibernateUtil.getSessionFactory().openSession();
        Query query = session.createQuery
            ("Select u.login, u.sid from User u Where u.login = :login");
        query.setParameter("login",login);
        List listOfData = query.list();
        return listOfData.size() == 1 
               && listOfData.get(0).toString().equals(sidDb);
    } catch (HibernateException e) {
        // Do you really just want to print the stack trace to stdout?
        // I would probably change the method to allow the exception
        // to bubble up...
        e.printStackTrace();
    } finally {
        if (session != null) {
            session.close();
        }
    }
}

答案 1 :(得分:4)

在尝试获取第一项之前,您应该检查listOfData的大小。在这种情况下,您的查询返回0或1结果。如果您想获得第一项,则应更改为get(0)。无论你应该编写代码来处理没有返回任何内容的查询。

看起来你在比较结果方面也有错误。

        String sidDb = listOfData.get(1).toString();
        if (sid == sidDb) {
            result = true;  
        }

应改为。

     String sidDb = listOfData.get(0).getSid()
     if (sid.equals(sidDb)) {
         result = true;  
     }

答案 2 :(得分:2)

您的查询未返回数据库中的任何行,因此listofData不包含任何对象且其长度= 0。当您拨打

String sidDb = listOfData.get(1).toString();

您要求数组返回一个不存在的对象,因此该数组中的对象没有索引。