2013-07-01 1 views
-2

이해가 안 돼요 그것은 런타임 예외입니까?이상한 해, ConcurrentModificationException 행동

예외 : 방법은 개체 내부 틱 메소드의 호출

Exception in thread "Thread-0" java.util.ConcurrentModificationException 
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source) 
    at java.util.ArrayList$Itr.next(Unknown Source) 
    at threads.Main.tick(Main.java:181) 
    at threads.Main.run(Main.java:104) 

. 루프에서 추가하려는처럼

List<Object> gameObjects = new ArrayList<Object>(128); 
+9

이 충분한 정보가 아닙니다. 첫째, 예외는 무엇입니까. 또한 이러한 호출의 컨텍스트는 무엇입니까? 누가 코드를 호출하고 어떻게? –

+0

gameObjects는 어떤 종류입니까? – Cemafor

+0

'gameObjects '란 무엇입니까? 그것은 null입니까? – NINCOMPOOP

답변

3

가 보이는 :

gameObjects가 null이 아닙니다. Java는 이것을 허용하지 않습니다. 동일한 방법으로 추가하고 제거하면 실제로 많이 변경하지 않고 순 변경도 전혀 다르지 않으므로 루프 중에 컬렉션을 변경하려고하지 않습니다.

추가하려는 경우 반복기를 사용하여 추가해야합니다.

2

첫 번째 메서드는 루프에서 일부 컬렉션을 수정하기 때문에 예외를 throw합니다. 컬렉션에 순 변화가 없으므로 두 번째는 아닙니다. 추가 한 다음 요소를 제거하십시오.

add 메서드는 ConcurrentModificationException을 검사하지 않습니다. 오히려 각 루프 반복의 끝에 수정 사항이 있는지 컬렉션이 검사됩니다.

+0

그러나'Add' 메소드 호출은 다음의'Remove' 메소드 호출을 알 수 없으므로 순 변경을 추론 할 수없고 예외를 발생시키지 않기로 결정했습니다. 내가 놓친 게 있니? –

+1

@TheodorosChatzigiannakis'add' 메쏘드는 동시 수정을 검사하는 것이 아닙니다. – arshajii

+0

오, 네 말이 맞아, 방금 스택 추적을 봤어. 어쨌든 내 바보 같아. –

0

doc

에 따라이 예외 이러한 변경이 허가되어 있지 않은 경우에 객체의 동시 변경을 검출 한 방법에 의해 발생 될 수있다.

예를 들어, 한 스레드가 다른 스레드가 반복하는 동안 컬렉션을 수정하는 것은 일반적으로 허용되지 않습니다. 일반적으로 이러한 상황에서는 반복 결과가 정의되지 않습니다. 일부 반복자 구현 (JRE에서 제공하는 모든 일반 목적 컬렉션 구현을 포함)은이 동작이 감지 될 경우 이 예외를 throw하도록 선택할 수 있습니다. 을 수행하는 반복자는 빨리 실패하고 이 정상적으로 작동하지 않으므로 fail-fast 반복기로 알려져 있습니다. 에서 임의의 비 결정적 동작이 미래에 예측할 수없는 시간에 걸릴 위험이 있습니다.

0

트래버스 중에는 object을 변경할 수 없습니다.

JavaDoc 말의

은이 클래스의 반복자에 의해 반환 된 반복자 및 listIterator의 방법이 있습니다 르파 : 반복자의 작성 후에리스트는 구조적 이외 방법으로 시간이 변경되면 반복자 자체의 메소드 제거 또는 추가로 반복자는 ConcurrentModificationException을 발생시킵니다.

자세한 내용은 다음 링크를 참조하십시오. 그들은 당신이 배우는 것을 도울 것입니다.

Concurrent Modification exception http://docs.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html