관리 메뉴

피터의 개발이야기

[kotlin] Constructor threw exception; nested exception is java.lang.NullPointerException; 에러 해결방법 본문

Programming/Kotlin

[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을 허용하도록 한다.

 

ㅁ 함께 보면 좋은 사이트

Null safety

Comprehensive Guide to Null Safety in Kotlin

Kotlin NullPointerException: Parameter specified as non-null is null

Parameter specified as non-null is null 해결

반응형
Comments