2017-02-22 5 views
0

私は奇妙な問題に直面しています。以下のコードでは、userRoles.removeRole(strRole)を呼び出しているとき、2回目のforループが1回の反復処理後に中断しています。リストには2つの要素があります。最初のforループは2回実行されます。しかし、2回目は1回だけ実行されます。このメソッド呼び出しはbooleanを返します。誰も私のコードで何が間違っているのを助けてくれますか?Java:forループは、メソッド呼び出しのためにすべての繰り返しの前に中断されています。

 if(userRoles != null) 
     { 
      List<String> roles = userRoles.getRoles(); 
      String strUserName = userRoles.getUserName(); 

      for(String strRole: roles) 
      { 
       System.out.println("role : " + strRole); 
      } 
      //for(String strRole: roles) 
      for(int count = 0; count < roles.size() ; count++) 
      { 
       String strRole = roles.get(count); 
       System.out.println("role before check: " + strRole); 
       if(ur.hasRoleForUser(strRole, strUserName)) 
       { 
        System.out.println("role after check: " + strRole); 
        userRoles.removeRole(strRole); 
       } 
      } 

      System.out.println("role length: " + userRoles.getRoles().size()); 
      if(userRoles.getRoles().size() > 0) 
      { 
       ur.addUserRoles(userRoles); 
      } 
      blnSuccess = true; 
     } 
+1

removeRole(str)メソッドが行っていることを示してください。 – Abdulgood89

+0

なぜそれは奇妙なはずですか?列挙しているリストからアイテムを削除しています。 2 - 1 = 1. 'getRoles'は明らかに同じリストへの参照を返します。' removeRole'が短縮されます。 –

+0

@MargaretBloomはいあなたは正しいです...私はそれを正しく認識しませんでした...私はそれがアイテムが削除されているオブジェクトのリストを参照していない新しいオブジェクトと思った。ご返信ありがとうございます。 – NPException

答えて

2

ループ休憩あなたが横断しているリストの要素削除(削除した後、あなたのリストのサイズが1であるが、そう(< roles.sizeを数える)偽となる)ので

ループでは、最初に、ループの後に削除する要素を収集する必要があります

+0

イテレータを使用すると、 'removeRole'がそのイテレータの' remove'メソッドを呼び出すことができないため、 'ConcurrentModificationException'がスローされます。 –

+0

あなたは正しいです、答えを訂正してください。ありがとう@マーガレットブルーム – kamehl23

1

forループは各繰り返しの前にcount < roles.size()と評価されます。ため、あなたの最初の反復では、あなたがuserRoles.removeRole(strRole)を呼び出すという事実に

、次回にループが1のでroles.size()返される値は1になります。評価しますが(その時点でcountの値)1より大きいではありませんループはそれ以上の反復を停止します。

@ kamehl23が提供するように、リストイテレータを使用する必要があります。 現在トラバース中の要素を変更するには、ではなく、とすることをお勧めします。バグの時間を節約できます。

幸運。

+1

イテレータの項目は、構造的変更でない限り変更できます。それ以外の場合は、 'ConcurrentModificationException'を変更できます。 –

1

あなたのお返事ありがとうございます。私はそれを正しく認識しませんでした...私は役割が新しいオブジェクトとしてリストすると思っていましたが、各アイテムが削除されているオブジェクトのリストを参照しません。ここに私の更新されたコードです。

 if(userRoles != null) 
     { 
      List<String> roles = userRoles.getRoles(); 
      String strUserName = userRoles.getUserName(); 

      for(int count = roles.size()-1; count >= 0 ; count--) 
      { 
       String strRole = roles.get(count); 
       if(ur.hasRoleForUser(strRole, strUserName)) 
       { 
        userRoles.removeRole(strRole); 
       } 
      } 

      if(userRoles.getRoles().size() > 0) 
      { 
       ur.addUserRoles(userRoles); 
      } 
      blnSuccess = true; 
     } 
関連する問題