수색…


Null 가능 및 Null 불가능 유형

String 과 같은 일반 유형은 Null을 허용하지 않습니다. Null 값을 유지할 수있게하려면 ? 그들 뒤에 : String?

var string        : String = "Hello World!"
var nullableString: String? = null

string = nullableString    // Compiler error: Can't assign nullable to non-nullable type.
nullableString = string    // This will work however!

안전한 호출 연산자

nullable 형식의 함수 및 속성에 액세스하려면 특수 연산자를 사용해야합니다.

첫 번째, ?. , 액세스하려는 속성 또는 함수를 제공하거나 객체가 null 인 경우 null을 제공합니다.

val string: String? = "Hello World!"
print(string.length)   // Compile error: Can't directly access property of nullable type.
print(string?.length)  // Will print the string's length, or "null" if the string is null.

Idiom : 같은 null-checked 객체에서 여러 메소드 호출하기

null-checked 객체의 여러 메소드를 호출하는 우아한 방법은 Kotlin의 apply 과 같이 사용하는 것입니다.

obj?.apply { 
    foo()
    bar()
}

이 호출 foobar 에서 obj (인 thisapply 경우에만 블록) obj , 그렇지 않으면 전체 블록을 건너 뛰는, 비 null입니다.

함수 및 속성 호출의 암시 적 수신자가 아니더라도 nullable 변수를 nullable이 아닌 참조로 범위로 가져 오려면 apply 대신 let 을 사용할 let apply .

nullable?.let { notnull ->
    notnull.foo()
    notnull.bar()
}

notnull 은 아무 것도 지명되거나 암시 적 lambda 매개 변수를 통해 사용되지 않을 it 있습니다.

스마트 캐스트

컴파일러가 특정 지점에서 객체가 null이 될 수 없다고 추측 할 수 있다면 더 이상 특수 연산자를 사용할 필요가 없습니다.

var string: String? = "Hello!"
print(string.length)  // Compile error
if(string != null) {
    // The compiler now knows that string can't be null
    print(string.length)  // It works now!
}

참고 : 컴파일러는 null 체크와 의도 된 사용 사이에서 잠재적으로 수정 될 수있는 변경 가능한 변수를 똑똑하게 캐스트 할 수 없습니다.

변수가 현재 블록의 범위 밖에서 액세스 할 수있는 경우 (예 : 비 로컬 객체의 멤버이기 때문에), 스마트 캐스트하고 사용할 수있는 새 로컬 참조를 만들어야합니다.

반복 가능 및 배열에서 null을 제거하십시오.

때로는 형식을 Collection<T?> 에서 Collections<T> 로 변경해야합니다. 이 경우 filterNotNull 이 우리의 솔루션입니다.

val a: List<Int?> = listOf(1, 2, 3, null)
val b: List<Int> = a.filterNotNull()

Null Coalescing / Elvis Operator

가끔 null 허용 식을 if-else 형식으로 평가하는 것이 바람직합니다. elvis 연산자 인 ?: 는 이러한 상황에 대해 Kotlin에서 사용할 수 있습니다.

예를 들면 :

val value: String = data?.first() ?: "Nothing here."

data?.first() 또는 data 자체가 null 값을 생성하면 위의 식은 "Nothing here" 반환하고 그렇지 않은 경우 data?.first() 의 결과는 data?.first() 입니다.

동일한 구문을 사용하여 예외를 throw하여 코드 실행을 중단 할 수도 있습니다.

val value: String = data?.second() 
    ?: throw IllegalArgumentException("Value can't be null!")

주의 사항 : 단언 연산자 (예 : data!!.second()!! )를 사용하여 NullPointerExceptions을 던져 넣을 수 있습니다 data!!.second()!!

역설

!! 접미사는 null 허용을 무시하고 해당 유형의 null이 아닌 버전을 반환합니다. 오브젝트가 null 경우는 KotlinNullPointerException 가 Throw됩니다.

val message: String? = null
println(message!!) //KotlinNullPointerException thrown, app crashes

엘비스 운영자 (? :)

Kotlin에서 null reference 보유 할 수있는 변수를 선언 할 수 있습니다. 우리가 nullable 참조 a 가지고 있다고 가정하자. " a 가 널이 아니거나 사용한다면, 그렇지 않으면 널이 아닌 값 x 사용한다"라고 말할 수있다.

var a: String? = "Nullable String Value"

이제 a 는 null 일 수 있습니다. 우리의 가치에 액세스 할 필요가있을 때 그래서 a , 우리는이 값을 포함 여부, 안전 검사를 수행해야합니다. 이 안전 점검은 일반적인 if...else 문으로 수행 할 수 있습니다.

val b: Int = if (a != null) a.length else -1

하지만 여기에 사전 운영자 Elvis (연산자 엘비스 : ?: Elvis 가 온다. 위의 if...else 는 Elvis 연산자로 다음과 같이 표현할 수 있습니다.

val b = a?.length ?: -1

?: (여기서 : a?.length )의 왼쪽에있는 표현식이 null이 아닌 경우 elvis 연산자가이를 반환하고 그렇지 않으면 표현식을 오른쪽 (여기서는 -1 )으로 반환합니다. 오른쪽면 표현식은 왼쪽면이 널인 경우에만 평가됩니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow