안드로이드 앱 개발기 #31 - RxJava2 사용하며 만난 NullPointerException: The mapper function returned a null value.

RxJava2 라이브러리가 제공하는 Observable.map 메소드를 호출하는 코드에서 다음과 같은 예외가 발생했습니다.

java.lang.NullPointerException: The mapper function returned a null value.

예외가 발생하면, 그것이 일어난 위치를 Logcat에서 보통 볼 수 있습니다. 그 위치는 내 소스 파일의 몇번째 줄이라고 친절하게 알려주는데요. 이번 예외에서는 그게 드러나지 않아서 잠시 당황했습니다.


Observable 인터페이스의 map 메소드에 관해....

서버 연동 라이브러리는 retrofit2를 사용하고 있구요. 서버로부터 데이터를 구독하기 위해 RxJava2도 활용하고 있습니다. 서버로부터 받은 데이터는 그것을 바로 활용하기도 하지만요. 그것에는 앱이 필요로 하는 내용 외에 다른 자료들도 많이 갖고 있는 경우가 많습니다. 앱 입장에서 그런 것은 불필요하기 때문에 앱이 필요로 하는 포맷으로 재가공합니다. 재가공을 위해 자주 사용하는 메소드는 Observable 인터페이스의 map입니다.


NullPointerException의 원인

오류 메시지의 원인을 이해하는 것이 문제 해결의 시작이었습니다.

The mapper function returned a null value.

제 코드에서는 Observable 인터페이스의 map 메소드를 사용하고 있었구요. 그것을 호출할 때 사용되는 람다식을 확인해 보니 실제로 null 값을 리턴하는 케이스가 있음을 발견했습니다. 원래는 리스트를 리턴해야 하는데, 서버에서 리스트를 주지 않는 것이 원인이었습니다.


해결책

서버에서 빈 리스트를 주는 것이 원래는 제일 좋지만, 이 문제는 map 메소드의 람다식에서 null 대신 다른 값을 리턴하면 됩니다. 만약 원래 리턴해야 하는 것이 리스트이고 그것이 현재 null이라면, 비어있는 리스트를 리턴하면 됩니다.

서버로부터 response를 받기 위한 Observable 객체 이름이 responseObservable이고, response가 list를 가지고 있다고 가정해 보겠습니다. 앱에서 list만 필요하다면, response로부터 list만 추출하면 되겠지요. 아래와 같이 map 메소드를 호출하면 됩니다.

responseObservable.map { response ->
    response.list
}

그런데 위 코드에서는 list가 null인 경우를 고려하지 않고 작성한 것입니다. 이 코드를 그대로 쓰면 위에 말씀드린 NullPointerException이 발생할 수 있죠. 이를 막기 위해 list가 null이면 빈 리스트를 대신 리턴시키면 됩니다. 수정 코드는 아래와 같습니다.

responseObservable.map { response ->
    response.list ?: listOf()
}

지난 안드로이드 앱 개발기

Sort:  
 2 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Upvoted! Thank you for supporting witness @jswit.
default.jpg

Coin Marketplace

STEEM 0.20
TRX 0.12
JST 0.029
BTC 61533.72
ETH 3447.25
USDT 1.00
SBD 2.51