HTTP状态500 - 请求处理失败;嵌套异常是java.lang.IndexOutOfBoundsException:索引:4,大小:4

时间:2014-10-26 21:47:32

标签: java

无法理解为什么索引越界。发生这种情况的通常情况似乎不是问题所以我有点卡住了。请帮忙

@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;
}

2 个答案:

答案 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中只有一个项目,然后ij在循环之前都是1。

因此,在你的循环中,检查

if(i>j){
    return true;
}

i == j1 == 1以来不会成立。所以你的程序将继续第二个if声明。

现在,在第二次检查中:

if(listUser.get(i).getEmail()==user.getEmail()){
    return false;
}
你打电话给:

listUser.get(i)

由于i为1,且列表只有一个项目,因此该项目位于0位,而不是1,因此您尝试访问范围之外的值。

另外,假设电子邮件是Strings,您使用==运算符进行比较,这是不正确的。您应该使用equals()代替。 Here's why

此外,你的循环比它需要的更复杂。一种可以简化它的方法是使用foreach循环,您不需要ij,代码会更清晰:

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;
}