본문 바로가기

# 02/코틀린

[Kotlin] Null 예외처리 - etc

반응형

안전한 형 변환 - java


Object object = "name";

int index = (int) object;

System.out.println("index " + index);


-> java.lang.ClassCastException 발생



- instanceof 추가하여 안전하게 처리


Object object = "name";

int index = 0;

if( object instanceof Integer) {                      // object 값이 Integer인지 확인하고 맞으면 변환하므로 안전한 방법임!!

index = (int) object;

}

System.out.println("index " + index);




코틀린 안전한 형변환 시도하기


val a : Any? = "ABC"

val b : Int? = a as Int


-> ClassCastException 발생


val a : Any? = "ABC"

val b : Int? = a as? Int ?: 0

// 디컴파일 해보면 자바에서 instanceof 로 실행됨을 알 수 있음




when을 사용하여 안전한 처리


val a : Any? = "ABC"

when (a) {

is Int -> println(a)

is String -> println(a)

else -> println("nothing")

}




List에서 null 아이템을 제외하기


-> java

List<String> itemList = new ArrayList<>();

itemList.add("A");

itemList.add(null);

itemList.add("B");


for (String text : itemList) {

if (text != null) {

Log.d("TAG", "Text : " + text);

}

}


-> kotlin

val listVithNulls : List<String?> = listOf("A", null, "B")

for (item in listWithNulls) {

if (item != null) {

println ("Text : $item")

}

}


-> kotlin 람다식 스트림

val listWithNulls : List<String?> = listOf("A", null, "B")

listWithNulls.filter { it != null } .forEach {

println("Text : $it")

}




filterNotNull 이용하기


list의 filterNotNull


val listWithNulls : List<String?> = listOf ("A", null, "B")


// listWithNulls.filter { it != null }.forEach {

//     println("Text : $it")

// }


// null filter

val itemList : List<String> = listWithNulls.filterNotNull()           // null을 허용하는 list에서 null을 허용하지 않는 list로 바꿔줌

itemList.forEach {

println("Text : $it")

}




block을 이용한 null 예외처리


kotlin 라이브러리

- 코틀린에는 유용한 standard(run, let, apply 등)을 제공한다.

- 한 번에 많은 처리를 할 수 있다.


kotlin 라이브러리를 이용한 null 예외처리


data class Sample(val name : String, val age : Int, val id : String)


fun test() {

val sample : Sample? = Sample("User name", 20, "userId")


tvName.text = sample?.name ?: ""

tvAge.text = sample?.age ?: 0

tvId.text = sample?.id ?: ""


}


-> let 사용

data class Sample(val name : String, val age : Int, val id : String)


fun test() {

val sample : Sample? = Sample("User name", 20, "userId")


// tvName.text = sample?.name ?: ""

// tvAge.text = sample?.age ?: 0

// tvId.text = sample?.id ?: ""


sample?.let {                                                                        // sample 안의 값들을 한꺼번에 수정할 수 있다.

tvName.text = it.name

tvAge.text = it.age

tvId.text = it.id

} ?: println("sample is null!!!")

}


-> 엘비스 활용

data class Sample(val name : String, val age : Int, val id : String)


fun test() {

val sample : Sample? = Sample("User name", 20, "userId")


sample?.let {

tvName.text = it.name

tvAge.text = it.age

tvId.text = it.id

} ?: let {

println("sample is null!!!")

tvName.visibility = View.GONE

tvAge.visibility = View.GONE

tvId.visibility = View.GONE

}

}




List에서 let으로 null을 제외하기 - kotlin


val listWithNulls : List<String?> = listOf("A", null, "B")

for (item in listWithNulls) {

item?.let { println(it) }                               // prints A and ignores null

}


// or

listWithNulls.forEach { it?.let { println(it) } }




1개 이상의 null 체크


kotlin 라이브러리 이용한 null 예외처리


val a : String? = "ABC"


a?.let { println(it.length) }

a?.run { println(this.length) }

a?.apply { println(this.length) }

// ...



val a : String? = "ABC"

val b : String? = "BBB"


if (a != null && b != null) {

println ("$a $b")

}


->safeLet 라이브러리 사용

fun test() {

val a : String? = "ABC"

val b : String? = "BBB"


safeLet(a, b) { a, b ->

println("$a $b")

}

}


fun <T1 : Any, T2 : Any, R : Any> safeLet(p1 : T1?, p2 : T2?, block : (T1, T2) -> R?) :  R? {

return if (p1 != null && p2 != null) block(p1, p2) else null

}

fun <T1 : Any, T2 : Any, T3 : Any, R : Any> safeLet(p1 : T1?, p2 : T2?, p3 : T3?, block : (T1, T2, T3) -> R?) :  R? {

return if (p1 != null && p2 != null && p3 != null) block(p1, p2, p3) else null

}


Multiple variable let in Kotlin


-> unwrap 라이브러리 사용

val _a = foo("Hello")

val _b = foo("World")

val _c = foo(null)


// example : error handing

unwrap(_a, _b, _c) { a, b, c ->

println("$a, $b$c")                     // not invoked

} otherwise {

println("Nah!")                         // invoked because '_c' is null

}


kotlin-unwrap - importre 제작


반응형

'# 02 > 코틀린' 카테고리의 다른 글

[Kotlin] Class initializer  (0) 2019.07.12
[Kotlin] Class Inheritance  (0) 2019.07.11
[Kotlin] Null 예외처리  (0) 2019.07.11
[Kotlin] Null 처리 방법  (0) 2019.07.11
[Kotlin] return and jumps and This-expressions  (0) 2019.07.11