2017-04-24 1 views
-1

나는 ConcurrentUpdateException을 던지고있는 프로그램을 썼다. 나는이 동작을 이해할 수 없다. 어떤 예외를 통해서도 작업 할 수있는 스레드가 하나도없고 어떤 반복자도 가져 가지 않아야한다.정렬 후 ConcurrentUpdateException을 이해해야합니까?

정렬은 어떻게됩니까? 왜 이것이이 예외를 던지고 있습니까? 설명 해주십시오.

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 

public class Test { 
     public static void main(String[] args) { 
     List<Double> list1 = new ArrayList<Double>(Arrays.asList(3., 2., 0., 1., 2.)); 
     List<Double> subList = list1.subList(0, 3); 
     Collections.sort(list1); 
     System.out.println(subList.get(0)); 

    } 
} 
+0

스택 추적을 추가 할 수 있습니까? '3., 2., 0., 1., 2.'은 무엇입니까? –

+0

나를 위해 로컬로 코드를 실행할 때 예외는 없습니다. 단지'0.0'을 출력합니다. – SomeJavaGuy

+1

@Sergey가 지적했듯이, subList()는 원래 목록에 의해 지원되는 뷰를 반환합니다. 원본 목록의 구조적 변경으로 인해보기가 정의되지 않습니다. 예를 들어, 하위 목록에서 원래 목록의 요소 0 ~ 3을 원하고 원래 목록을 정렬하면 요소는 더 이상 원래 요소가 아닙니다. 요청). ConcurrentUpdateException은 멀티 스레딩 문제를 나타내는 것으로 보이므로 오해의 소지가 있습니다. 대신 상위 목록의 수정에 대한 명시적인 테스트가 긍정적 인 경우 예외가 발생합니다. –

답변

0

기능 subList 반환 이 목록 내의 지정된 범위의 뷰. 따라서 컬렉션을 정렬하면 subList도 변경됩니다. 그렇기 때문에 0.0이 아니라 3.0이 아닙니다.