【发布时间】:2012-10-11 02:51:08
【问题描述】:
我遇到了一个我无法弄清楚的问题。 如果你们能帮助我,那就太好了=)
我有一个 Lobby.Class,它有一个 draw() 方法:
public void draw() {
//USE ITERATOR TO DRAW
Iterator<Player> itr = players.iterator();
while(itr.hasNext()) {
Player player = itr.next();
int off = players.indexOf(player); //THE CORRECT HEIGHT
player.draw(off);
}
}
请注意,这是一个服务器/客户端游戏
Lobby.Class 还有一个名为 addPlayer() 的方法
public void addPlayer(String _playerName, String _class, String _string_id) {
int _id = Integer.parseInt(_string_id);
//CREATE THE NEW PLAYER
Player new_player = new Player(x, y, _id, _playerName, _class);
//IF THIS PLAYER IS ME
if(new_player.getID() == id) {
me = new_player;
} else {
//TELL THE NEW PLAYER I EXIST
ClientValue.getClient().iExist(_id);
//THIS WILL SEND TO CLIENT THAT WILL SEND TO THE SERVER
//THAT WILL LOOK FOR THE ID AND SEND TO CLIENT OF THAT ID
//AND THE CLIENT WILL SEND TO LOBBY UPDATE PLAYERS()
}
players.add(new_player);
chat.appendChat(chat.joinString(_playerName, _class));
}
Lobby.Class 还有一个名为 updatePlayers() 的方法
public void updatePlayers(String _playerName, String _class, String _string_id) {
//THIS IS CALLED WHEN THE SERVER TELLS THIS PLAYER
//ABOUT OTHER PLAYERS
int _id = Integer.parseInt(_string_id);
//CREATE THE NEW PLAYER
Player new_player = new Player(x, y, _id, _playerName, _class);
players.add(new_player);
}
现在我的问题是玩家列表,当我进入大厅时addPlayer()会在2个玩家加入时同时运行,或者当updatePlayers()与addPlayer()一起运行时
我得到的异常是:ConcurrentModificationException
我缺少两种方法,1 用于添加玩家,如果可能的话,使用迭代器,1 用于删除玩家。这样我就不会在通过它或添加/删除它时收到修改玩家列表的错误。
我尝试过使用 Iteror 和 ListIterator,但由于我以前从未使用过它们,我不知道该怎么做。我需要一些关于如何做到这一点的建议。 非常感谢提前=)
解决方案:
private List<Player> players = Collections.synchronizedList(new ArrayList<Player>());
public synchronized void playersList(String cmd, Player _player) {
Iterator<Player> itr = players.iterator();
if(cmd.equals("draw")) {
while(itr.hasNext()) {
Player player = itr.next();
int off = players.indexOf(player);
player.draw(off);
}
} else if(cmd.equals("add")) {
players.add(_player);
} else if(cmd.equals("remove")) {
players.remove(_player);
}
}
【问题讨论】:
-
"这个类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:如果列表在迭代器创建后的任何时间被结构修改,除了通过迭代器自己的方式删除或添加方法,迭代器将抛出 ConcurrentModificationException。"。你无法避免它,see。
-
好的,但是如果我在类的顶部初始化一个迭代器,然后使用该迭代器来添加和删除,那会起作用吗?另外我注意到Iterator没有add方法,这是否意味着我必须使用ListIterator?
-
你看到了你的链接,我看看能不能找到解决办法。
-
为了避免
ConcurrentModificationException被抛出,使用迭代器自己的方法。如果你使用List的remove()方法,异常会一直抛出,对我来说,我总是使用ListIterator。 -
非常感谢您清理东西 =) 会尝试并回发
标签: java list iterator listiterator