Hey guys i am trying to solve the problem for 2 days now and dont know how to handle it. i tried to use an iterator also a copy ArrayList but it didnt solved my problem, below are my two relevant classes.I wanna check if my player is colliding with a gem and ig it is colliding then add the gem to item ArrayList and delete it from objects ArrayList.

<i>

package object;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import entity.Camera;
import entity.GameObject;
import entity.ObjectID;
import window.Animation;
import window.Game;
import window.Handler;
import window.Texture;

public class Player extends GameObject {

	// bereite und höhe des Rechtecks der das Object umhüllt für Collisin in
	// getBounds
	private float width = 32, height = 64;
	private float gravity = 0.02f;
	Handler handler;
	Texture tex = Game.getInstance();
	private Animation playerA, playerD, playerW, playerS;

	public Player(float x, float y, Handler handler, ObjectID id) {
		super(x, y, id);
		this.handler = handler;
		playerW = new Animation(10, tex.playerW.get(1), tex.playerW.get(2));
		playerS = new Animation(10, tex.playerS.get(1), tex.playerS.get(2));
		playerA = new Animation(10, tex.playerA.get(1), tex.playerA.get(2));
		playerD = new Animation(10, tex.playerD.get(1), tex.playerD.get(2));
		score = 0;

	}

	public void playerMovement() {
		x += velX;
		y += velY;

		if (jumping || falling) {
			velY += gravity;

		}

	}

	@Override
	public void tick(ArrayList<GameObject> object) {
		facingFigur();
		playerMovement();
		collision(object);
		playerW.runAnimation();
		playerS.runAnimation();
		playerA.runAnimation();
		playerD.runAnimation();

	}

	@Override
	public void render(Graphics g) {
		g.setColor(Color.BLUE);
		if ((this.x > -Camera.getX() + Game.WIDTH) || (this.x < -Camera.getX() - 32)
				|| (this.y > -Camera.getY() + Game.HEIGHT) || (this.y < -Camera.getY() - 32)) {
		} else {
			if (velX != 0 || velY != 0) {
				switch (facing) {

				case 1:
					playerD.drawAnimation(g, (int) x, (int) y, 24, 32);
					break;
				case -1:
					playerA.drawAnimation(g, (int) x, (int) y, 24, 32);
					break;
				case 2:
					playerW.drawAnimation(g, (int) x, (int) y, 24, 32);
					break;
				case -2:
					playerS.drawAnimation(g, (int) x, (int) y, 24, 32);
					break;
				}
			} else {

				switch (facing) {

				case 1:
					g.drawImage(tex.playerD.get(0), (int) x, (int) y, null);
					break;
				case -1:
					g.drawImage(tex.playerA.get(0), (int) x, (int) y, null);
					break;
				case 2:
					g.drawImage(tex.playerW.get(0), (int) x, (int) y, null);
					break;
				case -2:
					g.drawImage(tex.playerS.get(0), (int) x, (int) y, null);
					break;
				}

			}
		}

	}

	// Collision

	private void collision(List<GameObject> object) {

		for (GameObject objectt : handler.objects) {

			if (objectt.getID().equals(ObjectID.Tree) || objectt.getID().equals(ObjectID.Block)) {

				if (getBoundsTOP().intersects(objectt.getBounds())) {
					y = objectt.getY() + (height / 2);
					velY = 0;

				}

				if (getBounds().intersects(objectt.getBounds())) {
					y = objectt.getY() - height;
					velY = 0;

				} else {

				}

				if (getBoundsRIGHT().intersects(objectt.getBounds())) {
					x = objectt.getX() - width;

				}
				if (getBoundsLEFT().intersects(objectt.getBounds())) {
					x = objectt.getX() + width;

				}

			}

		}

		for (GameObject objectt : handler.objects) {
			if(objectt.getID().equals(ObjectID.Gem)) {
				if(getBoundsTOP().intersects(objectt.getBounds())) {
					handler.collectedItems.add(objectt);
				}
			}

		}
		handler.objects.removeAll(handler.collectedItems);

	}

	public void facingFigur() {
		if (velX < 0) {
			facing = -1;
		} else if (velX > 0) {
			facing = 1;
		}

		if (velY < 0) {
			facing = 2;
		} else if (velY > 0) {
			facing = -2;
		}

	}

	public Rectangle getBounds() {
		return new Rectangle((int) ((int) x + (width / 2) - width / 4), (int) ((int) y + (height / 2)), (int) width / 2,
				(int) height / 2);
	}

	public Rectangle getBoundsTOP() {
		return new Rectangle((int) ((int) x + (width / 4)), (int) y, (int) width / 2, (int) height / 2);
	}

	public Rectangle getBoundsRIGHT() {
		return new Rectangle((int) ((int) x + width - 5), (int) y + 5, (int) 5, (int) height - 10);
	}

	public Rectangle getBoundsLEFT() {
		return new Rectangle((int) x, (int) y + 5, (int) 5, (int) height - 10);
	}

}
 </i>


<i>

 package window;

import java.awt.Graphics;
import java.util.ArrayList;
import java.util.Iterator;

import entity.GameObject;
import entity.ObjectID;

public class Handler {

	public ArrayList<GameObject> objects = new ArrayList<GameObject>();
	public ArrayList<GameObject> bullets = new ArrayList<GameObject>();
	public ArrayList<GameObject> collectedItems= new ArrayList<GameObject>();
	private GameObject tempObject;

	public void tick() {

		for (GameObject objectt : objects) {
			objectt.tick(objects);
		}
		
		for (GameObject bulletss : bullets) {
			bulletss.tick(bullets);
		}

		for (GameObject element : new ArrayList<GameObject>(bullets)) {
			if (element.isVisible() == false) {
				
				bullets.remove(element);
			}
		}
		
		

	}

	public void render(Graphics g) {

		for (GameObject o : objects) {
			o.render(g);

		}

		for (int i = 0; i < bullets.size(); i++) {
			tempObject = bullets.get(i);
			tempObject.render(g);

			/**
			 * andere variante for(GameObject o: object){ o.render(g);
			 */

		}

	}

	public void addObject(GameObject object) {

		this.objects.add(object);
	}

	public void addBullet(GameObject object) {

		this.bullets.add(object);
	}

	public void removeObject(GameObject object) {
		this.objects.remove(object);
	}

	public void removeAll() {
		this.objects.clear();
	}

	public int sizeOfObject(ObjectID id) {
		int count = 0;
		for (GameObject object : objects) {
			if (object.getID().equals(id)) {
				count++;
			}
		}
		return count;
	}

	// public void createLevel() {
	//
	// for (int xx = 0; xx < Game.WIDTH + 32; xx += 32)
	//
	// addObject(new Tree(xx, Game.HEIGHT - 32, ObjectID.Tree));
	// for (int yy = 0; yy < Game.WIDTH + 32; yy += 32)
	// addObject(new Tree(Game.HEIGHT + 166, yy, ObjectID.Tree));
	// for (int zz = 0; zz < Game.WIDTH + 32; zz += 32)
	// addObject(new Tree(Game.HEIGHT - 609, zz, ObjectID.Tree));
	// for (int ww = 192; ww < Game.WIDTH - 256; ww += 32)
	// addObject(new Tree(ww, Game.HEIGHT - 192, ObjectID.Tree));
	//
	// }

	/*
	 * for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
	 * String value = iterator.next(); if (value.length() > 5) { iterator.remove();
	 * } }
	 */

}
</i>


<i>
Exception in thread "Thread-2" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
	at java.util.ArrayList$Itr.next(Unknown Source)
	at window.Handler.tick(Handler.java:19)
	at window.Game.tick(Game.java:96)
	at window.Game.run(Game.java:76)
	at java.lang.Thread.run(Unknown Source)
</i>