2014-10-26 112 views
-1

無法理解爲什麼索引超出範圍。通常情況下,發生這種情況似乎不是問題,所以我有點卡住了。請幫助HTTP狀態500 - 請求處理失敗;嵌套異常是java.lang.IndexOutOfBoundsException:索引:4,大小: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

該指數的Listget操作應該是0≤指數< listUser.size()

您正在運行從1到listUser.size()listUser.size()是超出範圍。

另一方面 - 爲什麼使用迭代循環,並通過索引而不是使用迭代變量?

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; 
} 
相關問題