2014-10-26 1 views
-1

Не могу понять, почему индекс за пределами. Обычный случай, когда это происходит, кажется, не проблема, поэтому я немного застрял. Пожалуйста, помогитеСостояние HTTP 500 - обработка запроса не удалась; вложенное исключение - java.lang.IndexOutOfBoundsException: Index: 4, Size: 4

@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

Индекс к get операции List «s должно быть 0 ≤ индекс < listUser.size().

Вы бежите с 1 по listUser.size(), listUser.size() находится за пределами.

Как в стороне - зачем использовать цикл итерации и получить по индексу вместо использования переменной итерации?

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; 
} 
Смежные вопросы

 Смежные вопросы