CSV파일을 읽으면서 생성한 List<List> 객체에서 꺼낸,
List 객체에 대하여 add() 메소드를 호출했을 때 이 오류가 발생하였다.
이 객체는 BufferedReader를 이용해 CSV파일을 읽는 과정에서,
아래처럼 Arrays.asList로 만들었고 그걸 ArrayList에 담아뒀다가 꺼내서 사용하는 상황이다.
while ((line = br.readLine()) != null) {
List<String> aLine = new ArrayList<String>();
String[] lineArr = line.split(",");
aLine = Arrays.asList(lineArr);
csvList.add(aLine);
}
문제는 간단하다. 모든 List가 add메소드를 지원하지는 않는다.
Arrays.asList 는 Arrays 클래스 내부에 구현해놓은 내부 클래스인 ArrayList를 반환한다.
기능적으로만 생각하자면 이 리스트는 사이즈가 고정되어 있기 때문에 add메소드를 사용할 수 없다.
또 자바 API가 설계된 것을 살펴보는 관점에서 보자면
Arrays 클래스의 코드를 봐도 왜 add메소드를 쓸 수 없는지 알 수 있다.
Arrays 클래스의 내부클래스인 ArrayList는 AbstractList 클래스를 상속받고 여러 기능들을 재정의하고 있다.
하지만 add메소드는 재정의하지 않았다.
그러니까 이 ArrayList는 add메소드를 제공하지 않는 리스트로 설계된 것이다. = 사이즈가 고정된 List니까.
해결방법도 간단하다.
아래와 같이 util패키지의 ArrayList클래스를 통해 생성하면 된다.
aLine = new ArrayList<>(Arrays.asList(lineArr));