일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- kotlin spring
- 코틀린 코루틴의 정석
- CKA 기출문제
- AWS EKS
- Elasticsearch
- Kubernetes
- kotlin
- Java
- IntelliJ
- kotlin querydsl
- PETERICA
- 정보처리기사 실기 기출문제
- 오블완
- 공부
- CloudWatch
- minikube
- AI
- Linux
- MySQL
- mysql 튜닝
- Spring
- kotlin coroutine
- 정보처리기사실기 기출문제
- CKA
- APM
- 기록으로 실력을 쌓자
- 티스토리챌린지
- 정보처리기사 실기
- aws
- Pinpoint
- Today
- Total
피터의 개발이야기
[kotlin] Constructor threw exception; nested exception is java.lang.NullPointerException; 에러 해결방법 본문
[kotlin] Constructor threw exception; nested exception is java.lang.NullPointerException; 에러 해결방법
기록하는 백앤드개발자 2024. 7. 29. 10:10
ㅁ 들어가며
ㅇ [Kotlin] 널 안정성, Null safety에서 Kotlin의 타입 시스템은 null 참조로 인한 위험을 제거하기 위해 설계되었다고 설명하였다.
ㅇ 하지만 작업 중 NullPointerException이 발생하여 이를 해결하는 과정을 정리하였다.
ㅇ 정리하면서 [Kotlin] 널 안정성, Null safety에 더하여 NullPointerException 주의 해야할 목록을 정리해 보았다.
ㅁ NullPointerException 메시지
Constructor threw exception; nested exception is java.lang.NullPointerException; Parameter specified as non-null is null
ㅇ 이 에러는 Kotlin에서 null이 허용되지 않는 파라미터에 null 값이 전달될 때 발생한다.
ㅇ 이 오류는 Kotlin의 널 안전성(Null Safety) 기능과 관련이 있다.
ㅇ "Parameter specified as non-null is null"이라는 메시지는 null이 될 수 없는 파라미터에 null 값이 전달되었다는 의미이다.
ㅇ 컴파일 단계에서 놓쳤던 나의 상황을 정리해보자.
ㅁ 상황
ㅇ Kotlin, Spring Validation을 이용하여 입력 데이터의 유효성을 검사하고 있었다.
ㅇ FE의 요청으로 이 로직을 null 허용으로 수정하였다.
data class ValidRequestDto(
@field:NotNull(message = "value는 필수 입력값입니다.") <= FE의 요청으로 제거
val value: String, <= ?을 선언하지 않았다.
@field:NotNull(message = "createdAt은 필수 입력값입니다.")
val createdAt: LocalDate? = null,
@field:NotNull(message = "number는 필수 입력값입니다.")
val number: Long? = null
)
ㅇ 입력 받은 값의 NotNull 체크를 하는데, 프론트의 요청으로 @field:NotNull을 제거하였다.
ㅇ 문제는 Kotlin에서 기본적으로 모든 파라미터가 null을 허용하지 않아, 생성자에 null 허용, ?를 선언해야 하는데 하지 않았다.
ㅇ 더욱이 Build 시 컴파일 에러도 발생하지 않았다.
ㅁ 해결
data class ValidRequestDto(
val value: String?, <= ?을 선언
ㅇ 문제해결은 ?을 입력하면 된다.
ㅁ Kotlin에서 NullPointerException 주의사항
ㅇ 생성자 파라미터 확인
class MyClass(val name: String?)
Kotlin에서는 기본적으로 모든 파라미터가 null을 허용하지 않는다. 생성자에서 null을 허용하도록 설정해야 한다.
ㅇ Kotlin의 기본값 사용
class MyClass(val name: String = "default")
Kotlin에서는 파라미터에 기본값을 설정할 수 있다. 기본값을 설정하여 null 값을 방지한다.
ㅇ 의존성 주입 시 확인
@Service
class MyService(
private val myRepository: MyRepository
)
Spring에서 의존성 주입 시 null 값이 주입될 수 있다. 주입되는 값이 null이 아닌지 확인해야 한다.
ㅇ @Autowired 어노테이션 확인
@Service
class MyService {
@Autowired
private lateinit var myRepository: MyRepository
}
의존성 주입 시 @Autowired 어노테이션을 사용하여 주입되는 값이 null이 아닌지 확인한다.
ㅇ @Nullable 어노테이션 확인
@Service
class MyService(
@Nullable private val myRepository: MyRepository?
)
주입되는 값이 null일 수 있는 경우 @Nullable 어노테이션을 사용하여 null을 허용하도록 한다.
ㅁ 함께 보면 좋은 사이트
ㅇ Comprehensive Guide to Null Safety in Kotlin
ㅇ Kotlin NullPointerException: Parameter specified as non-null is null
'Programming > Kotlin' 카테고리의 다른 글
[Kotlin] Spring Boot와 Kotlin으로 QueryDSL 페이징 처리하기 (0) | 2024.08.04 |
---|---|
[Kotlin] Spring Validation 이용한 입력 데이터 유효성 검증 (0) | 2024.07.30 |
[Kotlin]JPA의 더티 체킹 (Dirty Checking) (0) | 2024.07.28 |
[Kotlin] QueryDSL와 MapStruct를 사용하여 DTO에서 필요한 부분만 업데이트하기 (0) | 2024.07.27 |
[Kotlin] Kotlin의 스프레드 연산자 (Spread Operator) 이해하기 (0) | 2024.07.26 |