Page tree
Skip to end of metadata
Go to start of metadata

null 처리

1. if 문

val str: String? = null
if (str != null) {
    println(str.first().toUpperCase())
}


2. safe call


val str: String? = null
println(str?.first()?.toUpperCase())


3. elvis 연산자

val str: String? = null
str ?: return

println(str.first().toUpperCase())

val str: String? = null
println(str?.first()?.toUpperCase() ?: "")

4. scope 함수와 safe call 사용

val str: String? = null
str?.let { /* ... */ }
str?.apply { /* ... */ }
str?.also { /* ... */ }
str?.run { /* ... */ }

5. 에러를 일으키기

val str: String? = null 
println(str!!.first().toUpperCase())

val str: String? = null
println(requireNotNull(str).first().toUpperCase())

val str: String? = null
require(str != null)
println(str.first().toUpperCase())


예외처리

예외가 던져지는 경우

val str = "a"
val i = try {
    str.toInt()
} catch (e: Throwable) {
    0
}
println(i)

null이 반환되는 경우

val str = "a"
val i = str.toIntOrNull() ?: 0
println(i)

Result 사용

val str = "a"
val i: Result<Int> = runCatching { str.toInt() }
println(i.getOrNull())
println(i.getOrElse { 0 })
println(i.getOrThrow())
i.onSuccess { /* ... */ }
i.onFailure { /* ... */ }
i.fold(
    onSuccess = { println(i) },
    onFailure = { /* ... */ }
)

sealed classes

sealed class FileType {
    object Image : FileType()
    object Video : FileType()
    object Music : FileType()
    data class Other(val ext: String) : FileType()
}

val fileType: FileType = FileType.Image
when (fileType) {
    FileType.Image -> println("이미지")
    FileType.Video -> println("비디오")
    FileType.Music -> println("음악")
    is FileType.Other -> println("ext: ${fileType.ext}")
}

exhaustive when


에러나지 않음
val fileType: FileType = FileType.Image
when (fileType) {
    FileType.Image -> println("이미지")
}
컴파일 에러 발생
val fileType: FileType = FileType.Image
when (fileType) {
    FileType.Image -> println("이미지")
}.let {}

컴파일 에러 발생
val <T> T.exhaustive: T 
    get() = this

val fileType: FileType = FileType.Image
when (fileType) {
    FileType.Image -> println("이미지")
}.exhaustive
컴파일 에러 발생
object Do {
    inline infix fun<reified T> exhaustive(any: T?) = any
}

val fileType: FileType = FileType.Image
Do exhaustive when (fileType) {
    FileType.Image -> println("이미지")
}
  • No labels