본문 바로가기

소프트웨어

java.lang.UnsupportedOperationException 발생 케이스

반응형

jdk17 버전부터 Stream 연산 후 결과를 Stream.toList() 로 return 할 수 있는데요

public class UnsupportedOperationExceptionTest {  
    @Test  
    void unsupportedOperationExceptionTest() {  
        Stream<String> stream =  
            Stream.<String>builder()  
                .add("ccc")  
                .add("aaa")  
                .add("bbb")  
                .build();  
        List<String> list = stream.toList();  
        Collections.sort(list);  
    }  
}

이런 코드를 실행시키면 아래와 같이 UnsupportedOperationException 이 발생합니다

java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)
at java.base/java.util.ImmutableCollections$AbstractImmutableList.sort(ImmutableCollections.java:261)
at java.base/java.util.Collections.sort(Collections.java:145)
...


https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/java/util/stream/Stream.java#L119

public interface Stream<T> extends BaseStream<T, Stream<T>> {
    @SuppressWarnings("unchecked")
    default List<T> toList() {
        return (List<T>) Collections.unmodifiableList(new ArrayList<>(Arrays.asList(this.toArray())));
    }
}

 

toList() 메서드는 위 코드와 같이 unmodifiableList를 return 합니다. Stream 에서 return된 unmodifiableList를 Collections.sort() 메서드로 수정을 시도해서 그런 것인데요
unmodifiableList가 필요한 상황이라면 복사해서 사용하도록 하고, unmodifiableList가 굳이 필요하지 않다면 기존의 jdk8 버전부터 많이 사용하던 Stream.collect(Collectors.toList()) 를 사용해도 되겠습니다
(Stream.collect(Collectors.toUnmodifiableList()) 를 사용해도 Stream.toList() 를 사용한 결과와 동일하게 UnsupportedOperationException 이 발생합니다...)

반응형