Post

Java java.lang.UnsupportedOperationException 오류

1. UnsupportedOperationException 에러

  • 에러 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void main(String[] args) {
    int[] intAry = {1, 2, 3, 4, 5};
    Integer[] integerAry = {1, 2, 3, 4, 5};
    String[] stringAry = {"aa", "bb", "cc", "dd", "ee"};

    List<Integer> intList = Arrays.stream(intAry).boxed().toList();
    intList.add(6);
    System.out.println("intList = " + intList);

    List<Integer> integerList = Arrays.stream(integerAry).toList();
    integerList.add(6);
    System.out.println("integerList = " + integerList);

    List<String> strList = Arrays.asList(stringAry);
    strList.add("ff");
    Collections.reverse(strList);
    System.out.println("strList = " + strList);
}
  • 에러 메시지
1
2
3
4
5
6
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)
	at java.base/java.util.ImmutableCollections$AbstractImmutableList.set(ImmutableCollections.java:260)
	at java.base/java.util.Collections.swap(Collections.java:501)
	at java.base/java.util.Collections.reverse(Collections.java:382)
	at com.example.demo.Test.main(Test.java:19)

2. 원인

Arrays.asList() 메소드는 고정길이의 원배열의 list view를 리턴 한다.

Arrays.asList()를 사용해서 배열을 List로 변환한 후, 길이를 List에 값을 추가하는 것이 불가능하고, 원래 배열의 값을 변경하면 List의 값도 같이 변경된다.

원본 배열의 값과 변환 된 List의 값이 동기화 되는 것을 막기 위해 Arrays.asList()로 변환한 List를 새로운 ArrayList 객체를 생성해서 사용할 수 있다.

3. 해결 방법

  • 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void main(String[] args) {
    int[] intAry = {1, 2, 3, 4, 5};
    Integer[] integerAry = {1, 2, 3, 4, 5};
    String[] stringAry = {"aa", "bb", "cc", "dd", "ee"};

//        List<Integer> intList = Arrays.stream(intAry).boxed().collect(Collectors.toList());
    List<Integer> intList = new ArrayList<>(Arrays.stream(intAry).boxed().toList());
    intList.add(6);
    System.out.println("intList = " + intList);

    List<Integer> integerList = new ArrayList<>(Arrays.asList(integerAry));
    integerList.add(6);
    System.out.println("integerList = " + integerList);

    List<String> strList = new ArrayList<>(Arrays.asList(stringAry));
    strList.add("ff");
    Collections.reverse(strList);
    System.out.println("strList = " + strList);
}

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.