2016-04-25 243 views
-1

我有這種方法在登錄之前檢查用戶的用戶名和密碼。現在我的for循環僅檢查第一個項目,它發現第一個項目u.getRole().equalsIgnoreCase("recruiter")的第一個條件不滿足,因此不是檢查第二個項目,而是檢查第二個項目,然後返回null。爲什麼我的循環只檢查第一個元素?

爲什麼會發生這種情況?

這裏是我的方法:

public User check(String userName, String password) throws AdException { 

    try { 
     begin(); 
     Query q = getSession().createQuery("from User"); 
     ArrayList<User> list = (ArrayList<User>) q.list(); 
     System.out.println("recruiterList is: " + list); 

     for (User u: list) { 
      System.out.println("Before if user is: " + u); 

      if (u.getRole().equalsIgnoreCase("recruiter")) { 
       System.out.println("userName 1 is :" + u.getUserName()); 

       if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)) 
        System.out.println("After if recruiter is: " + u); 
       System.out.println("userName 2 is :" + u.getUserName()); 

       return u; 
      } 
      break;  
     } 


    } catch (HibernateException e) { 
     rollback(); 
     throw new AdException("Unfound " + userName, e); 
    } 

    return null; 
} 
+2

你有一個'return'語句;你的'if'必須評估爲'true'(或你'break')。 –

回答

-1
for (User u: list) { 
    if (u.getRole().equalsIgnoreCase("recruiter")) { 

    //sysout 

if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)) 
      //2 sysout 
     return u; 
    } 
    break;  //here break statement will exit your loop just after first Iteration. 
} 

因此請嘗試此代碼。

for (User u: list) { 
    if (u.getRole().equalsIgnoreCase("recruiter")) { 

    //sysout 

if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)){ 
      //2 sysout 
     return u; 
    } else{ 
       //your code if password doesnot matched 
     } 
     // continue even if more than one recruiter type User Object are in Database. 
    }else{ 
       //your code if user Role doesnot matched 
     } 

} //loop will check all element present in that array. and if it's ROLE is matched like "Recuriter" then it will check user and password. 
+0

爲什麼你添加冗餘繼續?循環將繼續。 –

+0

現在完美!非常感謝! – userZZZ

+0

@JonnyHenly我添加了,因爲如果他需要添加到這個特定的代碼,如果更多的邏輯,那麼他也可以這樣做。 這只是一種意識,你可以添加更多的代碼,如果你想.. –

3

那麼它是有道理的,因爲如果你成功了,你回來,如果你不這樣做,你打破,所以它打破:

for (User u: list) { 
    System.out.println("Before if user is: " + u); 
    if (u.getRole().equalsIgnoreCase("recruiter")) { 
     // code which returns at the end 
     return u; 
    } 
    break;  
} 

break;只要條件不滿足,語句就會被執行(否則,在到達條件之前您需要return),這就是爲什麼您總是隻檢查第一項。

如果您想檢查所有項目,只需從循環中刪除break;聲明。

+0

徹底回答:+1 –

+0

不,不管有沒有休息都行不通。我知道我的數據庫中的第一項不符合條件,所以它應該繼續並檢查第二項。我添加了其他{continue;}語句,它完美的工作! – userZZZ

3

在循環中使用break語句。這會導致循環退出。

1

正如已經指出的評論,你只有兩個循環的替代品,既能使環路完成(上returnbreak)剛剛起飛的break;陳述或者改變它的continue;

順便說一句,你爲什麼不select from User where role = 'recruiter'只?這將使數據庫服務器的往返不返回所有用戶,但只返回您感興趣的用戶。

1

您的代碼和邏輯錯誤。 ufor-each循環的迭代期間不會更改,它在每次迭代後都會更改。您的println聲明表明您認爲u將在第一個嵌套if聲明期間發生變化。因爲:

System.out.println("userName 1 is :" + u.getUserName()); 

和:

System.out.println("userName 2 is :" + u.getUserName()); 

出現在同一if塊,嵌套在for-each循環:

if (u.getRole().equalsIgnoreCase("recruiter")) { 
    System.out.println("userName 1 is :" + u.getUserName()); 

    if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)) 
     System.out.println("After if recruiter is: " + u); 
    System.out.println("userName 2 is :" + u.getUserName()); 

    return u; 
} 

你也不需要使用一個breakcontinue聲明。您不需要break聲明,因爲您有一個return聲明。您不需要continue聲明,因爲這是一個循環。

還要注意,沒有大括號的if語句({ ... })僅執行直接在它下面的行。例如:

if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)) 
    System.out.println("After if recruiter is: " + u); 

您的代碼應類似於:

public User check(String userName, String password) throws AdException { 

    try { 
     begin(); 
     Query q = getSession().createQuery("from User"); 
     ArrayList<User> list = (ArrayList<User>) q.list(); 
     System.out.println("recruiterList is: " + list); 

     for (User u: list) { 
      System.out.println("Before if user is: " + u); 

      if (u.getRole().equalsIgnoreCase("recruiter")) { 
       System.out.println("userName 1 is :" + u.getUserName()); 

       if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)) { 
        System.out.println("After if recruiter is: " + u); 
        // System.out.println("userName 2 is :" + u.getUserName()); 

        return u; 
       } 
      }  
     } 

    } catch (HibernateException e) { 
     rollback(); 
     throw new AdException("Unfound " + userName, e); 
    } 

    return null; 
} 

如果你想有一個println聲明輸出當前用戶名的指標是什麼,那麼就不要使用for-each使用經常的for循環。例如:

public User check(String userName, String password) throws AdException { 

    try { 
     begin(); 
     Query q = getSession().createQuery("from User"); 
     ArrayList<User> list = (ArrayList<User>) q.list(); 
     System.out.println("recruiterList is: " + list); 

     for (int i = 0; i < list.length; i++) { 
      System.out.println("Before if user is: " + u); 

      if (u.getRole().equalsIgnoreCase("recruiter")) { 
       System.out.println("userName " + (i + 1) + " is :" + u.getUserName()); 

       if (u.getUserName().equalsIgnoreCase(userName) && u.getPassword().equalsIgnoreCase(password)) { 
        System.out.println("After if recruiter is: " + u); 

        return u; 
       } 
      }  
     } 

    } catch (HibernateException e) { 
     rollback(); 
     throw new AdException("Unfound " + userName, e); 
    } 

    return null; 
} 
相關問題