- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试制作一个小游戏,但我陷入了这个错误。我在网上搜索了所有我能找到的就是使用
List<Entity> entity = Collections.synchronizedList(new LinkedList<Entity>());
不幸的是,这对我没有帮助,我尝试绕过 for 循环,但我仍然找不到解决办法。有人知道我怎样才能摆脱这个错误。
处理程序类
public List<Entity> entity = Collections.synchronizedList(new LinkedList<Entity>());
public List<Tile> tile = Collections.synchronizedList(new LinkedList<Tile>());
public void render(Graphics g){
for(Entity entity : entity){
entity.render(g);
}
for(Tile tile : tile){
tile.render(g);
}
}
public void update(){
for(Entity entity : entity){
entity.update();
}
for(Tile tile : tile){
tile.update();
}
}
public void addEntity(Entity entity){
this.entity.add(entity);
}
public void removeEntity(Entity entity){
this.entity.remove(entity);
}
public void addTile(Tile tile){
this.tile.add(tile);
}
public void removeTile(Tile tile){
this.tile.remove(tile);
}
抽象实体类(由每个实体扩展)
public int x,y,width,height;
public boolean solid;
public Id id;
public Handler handler;
public int velX,velY;
public boolean falling = true;
public boolean jumping = false;
public double gravity = 0.0;
public double health;
public boolean damageable = true;
public long damageTimer = System.currentTimeMillis();
public Entity(int x, int y, int width, int height, boolean solid, Id id,Handler handler){
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.solid = solid;
this.id = id;
this.handler = handler;
if(id==Id.Zombie) health=3.0;
if(id==Id.Player) health=5.0;
}
public abstract void render(Graphics g);
public abstract void update();
public void die(){
handler.removeEntity(this);
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public boolean isSolid() {
return solid;
}
public Id getId() {
return id;
}
public int getVelX() {
return velX;
}
public void setVelX(int velX) {
this.velX = velX;
}
public int getVelY() {
return velY;
}
public void setVelY(int velY) {
this.velY = velY;
}
public Rectangle getBounds(){
return new Rectangle(x,y,width,height);
}
public Rectangle getBoundsTop(){
return new Rectangle(x,y-6,width,6);
}
public Rectangle getBoundsBottom(){
return new Rectangle(x,y+height,width,6);
}
public Rectangle getBoundsLeft(){
return new Rectangle(x-6,y,6,height);
}
public Rectangle getBoundsRight(){
return new Rectangle(x+width,y,6,height);
}
public double getHealth() {
return health;
}
public void setHealth(double health) {
this.health = health;
}
错误:
Exception in thread "Thread-2" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:966)
at java.util.LinkedList$ListItr.next(LinkedList.java:888)
at Main.Handler.update(Handler.java:26)
at Main.GUI.update(GUI.java:100)
at Main.GUI.run(GUI.java:56)
at java.lang.Thread.run(Thread.java:745)
第 26 行是:
for(Entity entity : entity){
只有当有多个敌人的情况下有东西被杀死时,才会出现该错误。 (尤其是当有东西被杀死而另一个敌人非常非常接近时,这种情况就会发生)
添加:僵尸类(Entity.update();应该为使用此类创建的每个对象执行此类 update() 方法)
public Zombie(int x, int y, int width, int height, boolean solid, Id id, Handler handler) {
super(x, y, width, height, solid, id, handler);
}
@Override
public void render(Graphics g) {
g.setColor(Color.RED);
g.fillRect(x, y, width, height);
}
@Override
public void update() {
x+=velX;
y+=velY;
if(x<=0) x=0;
if(x+width >= GUI.WIDTH*GUI.SCALE+10) x = GUI.WIDTH*GUI.SCALE-width+10;
if(y+height >= GUI.HEIGHT*GUI.SCALE+10) y = GUI.HEIGHT*GUI.SCALE-height+10;
for(Tile tile: GUI.handler.tile){
if(tile.getId()==Id.Stone){
if(getBoundsTop().intersects(tile.getBounds())){
y = tile.getY()+tile.height;
}
if(getBoundsBottom().intersects(tile.getBounds())){
y = tile.getY()-height;
gravity=0.0;
falling=true;
jumping=false;
}
if(getBoundsLeft().intersects(tile.getBounds())){
x = tile.getX()+tile.width;
}
if(getBoundsRight().intersects(tile.getBounds())){
x = tile.getX()-width;
}
}
}
for(Entity entity: GUI.handler.entity){
if(entity.getId()==Id.Player){
if(System.currentTimeMillis()-damageTimer>1000){
damageable=true;
entity.damageable = true;
damageTimer+=1000;
}
if(new Rectangle(x-6,y-6,width+12,6).intersects(entity.getBounds())){
entity.damageable = false;
if(damageable){
if(entity.gravity>=0){
setHealth(getHealth()-1.0);
entity.falling = false;
entity.jumping = true;
entity.gravity = -10.0;
entity.setVelY((int) entity.gravity);
}
damageable=false;
}
}
if(getBoundsBottom().intersects(entity.getBounds())){
if(entity.damageable){
entity.setHealth(entity.getHealth()-1.0);
entity.damageable = false;
}
}
if(getBoundsLeft().intersects(entity.getBounds())){
if(entity.damageable){
entity.setHealth(entity.getHealth()-1.0);
entity.damageable = false;
}
}
if(getBoundsRight().intersects(entity.getBounds())){
if(entity.damageable){
entity.setHealth(entity.getHealth()-1.0);
entity.damageable = false;
}
}
}
}
if(jumping){
gravity+=0.2;
setVelY((int)gravity);
if(gravity>=0.5){
gravity+=0.1;
}
}
if(falling){
gravity+=0.3;
setVelY((int) gravity);
}
for(Entity entity : GUI.handler.entity){
if(entity.getId()==Id.Player){
if(entity.getY()<y&&!jumping&&getVelY()<=0){
if(entity.getY()<y-10){
if(entity.getX()<x){ velX = -3; }else{ velX = 3; }
gravity = -10.0;
jumping = true;
falling = false;
velY = (int)gravity;
} else {
if(entity.getX()<x){ velX = 3; }else{ velX = -3; }
}
}
}
}
if(health<=0) die();
}
最佳答案
你的问题出在你的die方法上。您正在尝试编辑当前正在迭代的列表实体。这会导致您的错误。
不要修改其中的列表,而是尝试有一个辅助列表来告诉您哪些实体已经死亡。完成所有更新后,您应该删除所有这些实体。
关于java - Eclipse, "Exception in thread "线程 - 2"java.util.ConcurrentModificationException",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45235587/
我在这个网站上发布的代码有这个问题 https://developers.google.com/drive/quickstart-cs是 Google Drive 快速入门的开发人员站点。我按照网站上
我正在尝试制作一个非常简单的 Kafka Producer,目前正在关注 producer example除了我的制作人没有分区程序类。 将所需文件导出到 jar 后,我将它们传输到我的 Linux
问题 在java中,我有一个“Util项目”,在进行单元测试时使用另一个“Mock项目”。 我的问题是“模拟项目”也使用“Util项目”来构建一些模拟对象。 当我使用 Maven 构建项目时,我无法构
据我所知,这些包已经存在很长时间了。但是,我从未见过它们的实际用法。而且这些包似乎不成熟,不再维护。如果是,为什么这些包现在存在? 最佳答案 包裹automata被 scala.xml.dtd 使用,
关闭。这个问题需要debugging details .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 1年前关闭。 Improve this question Co
在java.util.Collections中,有一个方法: public static void fill(List list, T obj) 用第二个参数指定的对象填充第一个参数指定的List。
我不明白它要我做什么。分配给 sentence正在工作: val sentences : java.util.List[CoreMap] = document.get(classOf[Sentence
在我的 React 应用程序中,我想使用一些实用程序。我见过两种不同的方法。第一个是,只是创建函数并将其导出。第二个是,创建一个 Util 类并导出一个对象,这样它就不能被实例化(静态类)。 clas
我有一个 util 类,它接受 String jwtToken 和 Key key 并使用 io.jsonwebtoken.jwts 解码 jwt。 但是,我无法对此进行测试。原因是,我无法模拟公钥并
我有使用目标命名空间的专有架构 xmlns:ax216="http://util.java/xsd" 这给我带来了从 java (java.util.xsd) 开始生成禁止的(由 Java 安全管理器
我正在阅读集合以查看 Javadocs 中的实现层次结构。 Collections声明为public class Collections extendds Object Collection声明为pu
我正在使用 Spring-boot 应用程序,我可以在其中连接 Azure 应用程序配置。但是当我尝试使用内容类型应用程序/JSON 读取值时出现错误。 我的Java类 @ConfigurationP
我正在使用 Spring-boot 应用程序,我可以在其中连接 Azure 应用程序配置。但是当我尝试使用内容类型应用程序/JSON 读取值时出现错误。 我的Java类 @ConfigurationP
我在使用格式说明符时遇到问题。这是否意味着我正在使用 %d? public static void main(String[] args) { double y, x; for (x =
鉴于此代码 import java.util.Iterator; private static List someList = new ArrayList(); public static void
我正在 HackerEarth 解决问题,我无法弄清楚为什么我的程序在命令行上正确运行并给出正确的结果,但在代码编辑器上运行时却给出 java.util.NoSuchElementException
我正在尝试使用以下代码使用对象列表列表中的数据填充tableModel readExcel.readSheet(0): TableModel tableModel = new DefaultTabl
java.util.Set 、 java.util.List 和其他 Collection 接口(interface)不可序列化。需要一个简单、直接的解决方案来在可序列化的 POJO 中使用它。 pu
我试图从 servlet 返回数据库搜索结果的 ArrayList 以显示在 jsp 页面上。 在servlet中设置arraylist作为请求的属性,并将请求转发到jsp页面。当我尝试在 jsp 页
我是android新手,最近我试图从firebase中提取数据到recyclerview/cardview中以垂直布局显示数据,它显示将Hashmap转换为Arraylist的错误,其中代码是:
我是一名优秀的程序员,十分优秀!