调用以下函数时出现错误。 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();
最佳答案
这段代码有很多问题:
- 您要求的是元素 1,即第二个元素。我怀疑您实际上的意思是
get(0)
来获取第一个元素。 - 当然,如果用户的登录名不存在,这仍然会失败......您应该首先使用
listOfData.size()
进行检查。 - 您不需要
result
变量 - 只需在知道答案时返回即可。 listOfData
变量可以在更严格的范围内声明,这通常是一个很好的做法。- 据我所知,您可能应该在
finally
block 中关闭 session 。 - 您不应该使用
==
来测试字符串相等性。 - 此时您可能不应该在代码中捕获
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();
}
}
}
关于java - 警告 : java. lang.IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6957970/