私の解決策は間違って別の質問の解決策と誤解されていると思います。それは編集されているので、ソリューションが重複で指摘されているように見えますが、これは明らかに私の問題を解決しなかっただけです。例外(問題の表面)を避けました。質問を再開する私の努力は役に立たなかったので、私はhere新しい1つを開いた。私自身のコードでConcurrentModificationException
私はConcurrentModificationException
を取得していますし、私はこの問題を解決することはできませんよ。だからリストから一連の要素を削除してエラーが出る。
これはエラーです:
04-Nov-2016 15:49:50.488 SEVERE [http-nio-8080-exec-199] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [Faces Servlet] in context with path [/...] threw exception [java.util.ConcurrentModificationException] with root cause
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:886)
at java.util.ArrayList$Itr.next(ArrayList.java:836)
at com.ex.PersonController.removeGroup(...)
at ....
Javaコード:
public void removeGroup(int age) {
if (person != null) {
List<Person> friends = person.getFriends();
List<Person> removeFriends = new ArrayList<>();
if (friends != null) {
for (Person p : friends) {
if (p.getAge() == age) {
removeFriends.add(p);
}
}
friends.removeAll(removeFriends);
}
}
EDIT: 注thisは明らかに私の問題を解決していないこと。ただし、エラーを発生させないようにしますが、JSFによって表示される結果は正しくありません。私のリストが完全に更新されていないのに、JSFがリフレッシュしようとしている可能性はありますか?
EDIT2: 私はこれが重複しているとは思いません。いくつかのテストで得たエラーは、thisまたはthisとなりました(何らかの理由で同じエラーが発生したことに注意してください)。しかし、JSFはまだ私が期待しているものを印刷していません。
XHTML Javaコード:
<c:forEach items="#{personController.groupedPersons}" var="personG">
<h:commandButton action="#{personController.removeGroup(personG.key)}" type="submit" value="Remove" >
<f:ajax render="@form" />
</h:commandButton>
#{personG.key} - #{personG.value.size()}
</c:forEach>
だから、人々の右側のリストを返すpersonController.groupedPersons
私はページを実行する最初の時間、私は再び情報のもう少しで私の質問から削除BalusCコードを書きます(HashMap<Integer, List<Person>>
)、うまく印刷します。この時点で私は2つのグループを持っています:同じ年齢の3人のグループと、異なる年齢の別の人。 をクリックすると、同じ年齢の3人のグループを削除し、コードをトレースし、イテレーターを使用して、ConcurrentModificationException
を発行せずに必要な人物をすべて削除します。返されたperson.getFriends();
のリストは、size = 1です。これは正しいです。次に、ajaxコードがフォームをレンダリングします。 personController.groupedPersons
が再度呼び出され、期待通りに1人が返されます。私は確認して、これは私が実際に期待している返品者です。しかし、JSFは間違った#{personG.key}
(私が削除したもの)とヌル#{personG.value.size()}
を印刷します。
私はそれに従うのが難しいかもしれないことは知っていますが、これについての説明はありますか?
EDIT 3: これも笑えるです...私は1人を持つグループを削除した場合、それが削除され、その後、JSFプリント3つの者と正しくグループ。私が3人でグループを削除すると、そのグループは削除され、JSFはEDIT2で述べたように、今削除したグループのkey
を印刷し、size()はnullです。 JSF間で並行処理の問題が発生している可能性はありますか?同時にリストを変更しているときにページをリフレッシュしていますか?(これはもともと私の心配で、ConcurrentModificationException
はXHTMLと私のマネージドBeanの間の並行性の問題から来ており、マネージドBeanのコード内だけではありませんでした)。それはなぜ私がConcurrentModificationException
を得たのかを、リストから削除する代わりにリストに追加したときに説明することができます。
あなたは本当にあなたの質問を編集して、完全にはならないあなたがラップする場合は、あなたの
friends
リストは、あなたが行くために良いことがありnew ArrayList(friends);
ですそれを変更。それはすべての答えを無効にし、後世の問題を台無しにする。 – Gray私は完全に質問を編集しませんでした。あなたが歴史の中で見ることができるように、それはBalusCでした。そして、私は編集を感謝しますが、私はまだJSFに何かがあると思っています。おそらくそうでないので、彼は完全にすべてを削除しました。 – user1156544
同時変更例外はJSFとは関係ありません。 JSFが期待しているものを印刷しないという事実は、(https://stackoverflow.com/questions/40442340/jsf-wrong-display-of-elements-when-iterating-a-mapに投稿したような)別の質問です。また、「複製」です。 JSFは、どのように使用するために設計されたように優れた動作をしています。 – Kukeltje