Предупреждение: java.lang.IndexOutOfBoundsException - PullRequest
0 голосов
/ 05 августа 2011

при вызове следующей функции я получаю сообщение об ошибке. Функции запросов 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 ]

4 голосов
/ 05 августа 2011

Вы должны проверить размер 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;  
     }
4 голосов
/ 05 августа 2011

В этом коде несколько ошибок:

  • Вы запрашиваете элемент 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();
        }
    }
}
2 голосов
/ 05 августа 2011

Ваш запрос не возвращает никаких строк из базы данных, поэтому listofData не содержит никаких объектов и его длина = 0. Когда вы звоните на

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

Вы просите массив вернуть объект, который не существует, поэтому в массиве нет индекса для объекта.

...