无法理解为什么索引越界。发生这种情况的通常情况似乎不是问题所以我有点卡住了。请帮忙
@Override
@Transactional
public Boolean RegVali(User user){
String hql = "from User";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
@SuppressWarnings("unchecked")
List<User> listUser = (List<User>) query.list();
int i=1;
int j=listUser.size();
for (Iterator<User> it = listUser.iterator(); it.hasNext();) {
if(i>j){
return true;
}
if(listUser.get(i).getEmail()==user.getEmail()){
return false;
}
else{
i++;
}
}
return true;
}
答案 0 :(得分:0)
List
get
操作的索引应为0≤index&lt; listUser.size()
。
您从1到listUser.size()
正在运行,listUser.size()
超出范围。
顺便说一句 - 为什么要使用迭代循环并通过索引而不是使用迭代变量?
答案 1 :(得分:0)
您有一个错误,因为i
初始化为1.原因是Java中的顺序结构(如数组和列表)是零索引的。意思是,第一个项目位于第0位,第二个项目位于第1位...因此,您应该做的是将i
初始化为0而不是1。
<强> 说明: 强>
我们假设您在listUser
中只有一个项目,然后i
和j
在循环之前都是1。
因此,在你的循环中,检查
if(i>j){
return true;
}
自i == j
或1 == 1
以来不会成立。所以你的程序将继续第二个if
声明。
现在,在第二次检查中:
if(listUser.get(i).getEmail()==user.getEmail()){
return false;
}
你打电话给:
listUser.get(i)
由于i
为1,且列表只有一个项目,因此该项目位于0位,而不是1,因此您尝试访问范围之外的值。
另外,假设电子邮件是Strings
,您使用==
运算符进行比较,这是不正确的。您应该使用equals()
代替。 Here's why
此外,你的循环比它需要的更复杂。一种可以简化它的方法是使用foreach
循环,您不需要i
或j
,代码会更清晰:
public Boolean RegVali(User user){
String hql = "from User";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
List<User> listUser = (List<User>) query.list();
for (User lUser : listUser) {
if(lUser.getEmail().equals(user.getEmail())){
return false;
}
}
return true;
}