java.lang.UnsupportedOperationException
at java.base/java.util.AbstractList.add(AbstractList.java:153)
at java.base/java.util.AbstractList.add(AbstractList.java:111)
테스트 코드를 작성하고 실행하던 중 오류가 발생했다.
조건을 주고, 메소드를 실행했는데 해당 메소드 실행에서 오류가 났다.
해당 오류는 일반적으로 List 형을 new로 초기화하지 않는 상태에서 Arrays로 생성하였을 시 주로 발생한다고 한다.
정확하다.. 테스트 코드에서 그렇게 코드를 작성했다.
List<String> userList = Arrays.asList(user2.getUsername());
리스트가 필요했는데, 한 줄로 간단하게 코드를 작성하려고 위의 코드처럼 작성을 하고
메소드의 파라미터로 만든 userList
를 넣어 실행했다.
실행하는 메소드 안에서, 파라미터로 넘겨준 userList
에 새로운 원소를 추가해주어야 하는데, 아마 그게 안되어서 오류가 난 것 같다.
Arrays.asList()
로 생성한 리스트의 경우 고정되어 원소 추가/삭제가 되지 않는다고 한다.
따라서 해당 코드를 아래와 같이 변경해주었다.
List<String> userList = new ArrayList<>();
userList.add(user2.getUsername());
찾아보니 위의 코드 말고도 아래와 같은 방법도 있었다.
List<String> userList = new ArrayList<>(Collections.singletonList(user2.getUsername()));
변하지 않는 하나의 요소를 가진 리스트를 만든다면, 해당 명령어를 사용할 수 있다.
하나가 아닌 여러 개의 요소로 불변하는 리스트로 만들고 싶은 경우 사용할 수 있다.
현재 CI/CD 까지 완료한 프로젝트의 코드를 리펙토링 하고 있는 중이다.
전에 Git Action으로 main에 push를 하면 build 할 때, 항상 unchecked or unsafe 오류가 났었다.
하지만 그렇다고 Build 자체가 실패하지는 않아서 우선 넘어갔었는데,
테스트 코드를 수정하면서 어떤 부분에서 발생한 오류인지 발견하게 되었다.
Note: 경로\ChatServiceTest.java uses unchecked or unsafe operations.
오류의 내용은 위와 같았다.
해당 내용은 신기하게도 Java5 부터 생긴 오류라고 한다.
제네릭 타입 클래스를 선언할 때, 자료형이 명시되지 않았을 경우 발생하며 주로 List나 Map 등의 사용에서 마주할 수 있는 듯 하다.
나의 경우에는 귀신같이 List를 사용하는 경우였다.
ArrayList arrayList = new ArrayList<>();
이렇게 선언해둔 부분이 있었다.
원래 같다면 List<String>
나 List<Long>
처럼 사용했을 텐데,
왜 저렇게 선언해두고 사용했는지 나도 나 자신을 알 수가 없다 ..
굳이 요상하게 코드를 작성하고 새로운 오류를 발견하게 되어서 뿌듯(?) 하다.
ArrayList 자체가 제네릭 타입이며, 자료형을 명시하지 않았을 경우에는
uses unchecked or unsafe operations
라는 오류 내용을 표시해주되,
프로젝트를 Build 할 때는 딱히 문제가 없다는 사실을 알게 되었다.
참고
https://needneo.tistory.com/141
https://qh5944.tistory.com/152
https://velog.io/@hwsa1004/uses-unchecked-or-unsafe-operations-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0