답변:
이것은 안전하지 않은 nullable 형식입니다 ( T?
nullable이 아닌 유형 (로) 변환 T
),
!!
슬로우합니다 NullPointerException
값이있는 경우 null
.
sale.latest
는 다음을 포함 할 수 있음을 의미 합니다 null
. 할당이 sale.latest
null이 아닌 경우에만 성공 하고 그렇지 않으면 NPE가 발생합니다. 이것은 null 안전을 제공합니다 val price
. 유형이 null이 아닙니다. 참조 kotlinlang.org/docs/reference/null-safety.html
!!
하면 NPE의 근본 원인을 신속하게 찾아 낼 수 있습니다. Java가 비슷한 기능 (즉, 추악한 if
진술 및 / 또는 assert
이온 제외)을 갖기를 바랍니다.
다음은 상황을 명확하게하는 예입니다. 이 기능이 있다고 가정 해보십시오.
fun main(args: Array<String>) {
var email: String
email = null
println(email)
}
다음과 같은 컴파일 오류가 발생합니다.
Null can not be a value of a non-null type String
이제 String
유형에 물음표를 추가하여 널 입력 가능하게 함으로써이를 방지 할 수 있습니다 .
그래서 우리는
fun main(args: Array<String>) {
var email: String?
email = null
println(email)
}
이 결과는
null
이메일 값이 null 일 때 함수에서 예외를 발생 시키려면 이메일 끝에 두 개의 느낌표를 추가 할 수 있습니다. 이렇게
fun main(args: Array<String>) {
var email: String?
email = null
println(email!!)
}
이것은 던져 KotlinNullPointerException
더블 뱅 오퍼레이터 는 팬 NullPointerException
(또는 짧은 경우 NPE) 팬에게 탁월한 옵션입니다 .
널 이 아닌 어설 션 연산자
!!
는 모든 값을 널 이 아닌 유형으로 변환 하고 값이 널인 경우 예외를 발생시킵니다.
val nonNull = a!!.length
그래서 당신은 쓸 수 a!!
있으며 이것은 null이 아닌 값을 반환 하거나 (예 a
: String
여기) NPE를 던질 것입니다.a
널 (null)입니다.
NPE를 원할 경우 NPE를 가질 수 있지만 명시 적으로 요청해야합니다. 개발자가 보증하는 경우이 연산자를 사용해야합니다. 값은 null이되지 않습니다 .
!!
이 진술의 끝에 있을 때 그것은 무엇을 의미 합니까? Kotlin으로의 IJ 자동 변환은 저를 위해 그렇게했습니다val price = sale.latest!!