@Mapper에서 Parameter specified as non-null is null 에러가 발생했다.
처음에는 자카르타 NotNull, NotBlank를 잘못 걸어둔건가 했는데... 아니었다.
val name: String // 문제가 됐던 코드
코드가 run되며 name에 null이 할당되는데, 이 때 null을 허용하지 않는 타입(String)이므로 해당 에러가 발생했다.
val name: String? = "",
null이 할당되어도 오류가 나지 않게 타입을 설정해주고, empty string을 할당해주었다.
위 코드는 아래와 같은 의미를 가진다.
- String?은 nullable String을 할당받을 수 있음을 의미한다.
- = "" 은 empty string을 할당했음을 의미한다.
- 즉 "null일 수 있는 변수를 선언하는데, 당장은 empty string값을 가질거야."라는 의미다.
이 기회에 코틀린의 null 타입 관련 연산자를 좀 공부해보자.
(1) val name: String? = ""
(2) val safeName = name ?: "" // null이라면 ""을 쓰세요
(1) 이 변수는 null 일수도 있는데요, 당장은 ""입니다. (초기값)
(2) name이 null 이라면요, ""을 쓰세요.
그리고 아래 코드는 컴파일 에러가 난다.
val name?: ""
출처 : https://0391kjy.tistory.com/51
Null을 허용하는 연산자 "?"
fun strLenSafe(s: String?) = ...
타입 이름 뒤에 물음표(?)를 붙이면 그 타입의 변수나 프로퍼티에 null을 허용할 수 있다는 뜻
safe call 연산자 "?."
safe call이 있다면 non-safe call도 있지 않을까? 그것이 바로 NPE(Null Pointer Exception)이다. null인 값을 호출하려고 할 때 발생하는.
이 지점에서 safe call의 의미를 추론해본다면, NPE를 방지하는 call이라는 것을 짐작할 수 있을 것이다.
호출하려는 값이 null이 아니면 그대로 메소드가 호출되고, 호출하려는 값이 null이면 이 호출은 무시되면서 null값을 반환된다.
/* null 체크가 연달아 필요한 경우 */
val country = user?.address?.country
엘비스 연산자 "?:"
fun getUserType(type: String?) {
val userType: String = type ?: "guest" //type이 null이면 디폴트값은 guest 이다.
}
좌항의 값이 null이 아니면 좌항 값을 그대로 반환하고, 만약 좌항 값이 null이면 우항 값을 디폴트 값으로 반환한다.
혼종
val abTestType = abTestData?.type ?: defaultType
abTestData의 null체크를 한 뒤 null 일 경우 defaultType을 리턴한다.
/* 엘비스 연산자에 return, throw 사용 예제 */
val userId = user?.getId() ?: return null
val userId = user?.getId() ?: throw IllegalArgumentException("No ID")
여기 포스팅도 좋으니 읽어보길 > https://landroid.tistory.com/4