나의 에러 일지

Java - UnsupportedOperationException 원인과 해결법

Cold Bean 2023. 2. 9. 20:00
728x90

팀 프로젝트가 끝이 났다. 모든 정신을 프로젝트에 집중하다보니 한 달이라는 시간이 금방 지나갔다.

그동안 손을 놓아버린 알고리즘과 다시 친해지기 위해 오랜만에 문제 하나를 풀어보았다.

 

오늘 다루게 될 에러는 알고리즘을 풀면서 만난 UnsupportedOperationException이다. 

Array를 List로 변환한 후 List 요소를 삭제하고 싶었는데, 이 과정에서 에러가 발생했다.

아래는 에러가 발생했던 코드이다.

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        List<String> compList = Arrays.asList(completion);

        for (String s : participant) {
            if (compList.contains(s)) {
                compList.remove(s);	// 여기서 예외 발생
            } else {
                answer = s;
            }
        }

        return answer;
    }
}
Exception in thread "main" java.lang.UnsupportedOperationException: remove
	at java.base/java.util.Iterator.remove(Iterator.java:102)
	at java.base/java.util.AbstractCollection.remove(AbstractCollection.java:299)
	at pgr42576.Solution.solution(Main.java:25)
	at pgr42576.Main.main(Main.java:13)

원인

UnsupportedOperationException은 지원되지 않는 요청이 들어왔을 때 발생하는 예외이다.

예를 들어, 수정할 수 없는 List의 요소에 수정 또는 삭제를 시도했을 때 발생한다.

List, Queue, Set, Map과 같은 Collections에서 많이 발생한다.

 

일반적으로 가장 많이 발생하는 원인은 asList() 메서드를 사용했을 때라고 한다.(나의 에러 발생 원인도 해당 이유때문이다.)

asList() 메서드를 사용하면 고정된 크기의 List가 생성되고, 수정할 수 없기 때문에  add()와 remove()를 사용할 수 없다.

 

나도 asList()로 생성된 List에서 요소를 삭제하려고 했기 때문에 UnsupportedOperationException이 발생했던 것이다.

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        List<String> compList = Arrays.asList(completion);	// 원인

        for (String s : participant) {
            if (compList.contains(s)) {
                compList.remove(s);	// 여기서 예외 발생
            } else {
                answer = s;
            }
        }

        return answer;
    }
}

해결 방법

아주 간단한다. asList()메서드로 생성된 수정 불가능한 List를 새로 생성한 List로 한 번 감싸면 수정 가능한 List로 반환된다.

class Solution {
    public String solution(String[] participant, String[] completion) {
        String answer = "";
        List<String> list = Arrays.asList(completion);	// 수정 불가능한 List
        List<String> compList = new ArrayList<>(list);	// 새로운 List에 전달하면 수정가능한 List로 반환된다.

        for (String s : participant) {
            if (compList.contains(s)) {
                compList.remove(s);
            } else {
                answer = s;
            }
        }

        return answer;
    }
}

참조

https://rollbar.com/blog/fixing-unsupportedoperationexception-in-java/

728x90