본문 바로가기
개발/자바

java List.of에는 null이 포함될 수 없다.

by hamcheeseburger 2024. 5. 28.

Java List.of() 에는 null이 요소로 포함될 수 없다.

List.of()의 설명을 살펴보면 'Throws: NullPointerException - if an element is null' 리스트 요소가 null인 경우 NullPointerException을 발생한다고 명시되어있다.

 

위의 of()에서 호출하고 있는 ListN() 메서드의 구현을 살펴보면, Objects.requreNonNull()로 null 체크를 하고 있다.

 

list.contains(null) 수행 시 NPE가 발생한다.

추가로 List.of()로 생성된 불변리스트에 contains(null) 수행 시에도 NPE가 발생한다.

이것도 코드 구현을 따라가보면 원인을 알 수 있다.

ImmutableConllections.java 내의 contains()

contains() 내에서 indexOf() 라는 메서드를 호출하고 있고, 해당 메서드 구현을 살펴보면 전달받은 파라미터에 대한 null 체크를 하고 있다.

 

왜 포함될 수 없게끔 설계했을까?

1. 불변성의 특징

List.of()는 불변리스트를 반환하고, 불변리스트는 생성된 이후 요소를 삭제하거나 추가할 수 없다. null이 요소로 포함된다면 해당 요소를 삭제할 수 없으므로 예상치 못한 예외를 발생할 가능성이 높아진다. 이 때문에 null을 포함하지 않는 방향으로 설계했을 가능성이 있다.

2. 안전성

개발자가 null 체크 코드를 추가하지 않아도 되는 장점이 있다. NPE 발생 가능성이 없다는 점에서 안전성이 높다.

 

 

리스트 생성에 굉장히 자주 썼던 방법인데, null이 포함될 수 없다는걸 이제 알았다는게 놀랍다 ㅎ.

나 같은 경우에는 contains(null) 을 사용하다가 알게됐다. 실제 코드에서는 가변리스트에 contains(null)이 수행되어서 예외가 발생되지 않았는데, 테스트코드에서는 mocking으로 List.of()를 반환하도록 하여 테스트에서만 예외가 발생하는 상황이었다.

그래서 원인을 알아내는데 꽤나 시간이 걸렸었다.

'개발 > 자바' 카테고리의 다른 글

JMH benchmark  (0) 2023.03.12
Java Atomic  (1) 2022.12.03
Java Closure  (0) 2022.12.03
기본형 특화 스트림(IntStream, LongStream, DoubleStream)  (3) 2022.10.09
함수형 인터페이스 (Functional Interface)  (6) 2022.03.30

이전 댓글