코 틀린 더블 뱅 (!!) 연산자는 무엇입니까?


177

Android Studio에서 Java를 Kotlin으로 변환하고 있습니다. 인스턴스 변수 다음에 두 번 강타합니다. 이중 강타 란 무엇이며 더 중요한 것은 어디에 기록되어 있습니까?

mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))

답변:


205

이것은 안전하지 않은 nullable 형식입니다 ( T?nullable이 아닌 유형 (로) 변환 T), !!슬로우합니다 NullPointerException값이있는 경우 null.

여기 에는 Kotlin null 안전 수단과 함께 여기 에 설명되어 있습니다 .


1
!!이 진술의 끝에 있을 때 그것은 무엇을 의미 합니까? Kotlin으로의 IJ 자동 변환은 저를 위해 그렇게했습니다val price = sale.latest!!
ycomp

7
@ycomp sale.latest는 다음을 포함 할 수 있음을 의미 합니다 null. 할당이 sale.latestnull이 아닌 경우에만 성공 하고 그렇지 않으면 NPE가 발생합니다. 이것은 null 안전을 제공합니다 val price. 유형이 null이 아닙니다. 참조 kotlinlang.org/docs/reference/null-safety.html
단축키

1
@ hotkey : 그렇다면 NPE를 얻는 것의 차이점은 무엇입니까? 아니면 null 객체에서 최신 메소드에 액세스 할 때?
Aada

2
@Aada, NPE를 디버깅하고 값을 null로 설정하는 행 / 실행 경로를 찾는 데 어려움을 겪는 것은 일반적인 문제입니다. 이 null 할당은 다른 컨텍스트, 수업 또는 심지어 하루에 발생할 수 있습니다! 사용 !!하면 NPE의 근본 원인을 신속하게 찾아 낼 수 있습니다. Java가 비슷한 기능 (즉, 추악한 if진술 및 / 또는 assert이온 제외)을 갖기를 바랍니다.
Cascader

82

다음은 상황을 명확하게하는 예입니다. 이 기능이 있다고 가정 해보십시오.

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


5
그래서 사람들은 왜 '!!' 변수에 null이 있으면 앱이 종료되므로 안전하지 않더라도?
Sam

3
@david 변수가 null이 아닌 것을 100 % 확신하고 (예를 들어 명시 적으로 확인한 경우) 널이 허용되지 않는 변수가 필요한 경우에만 사용할 수 있습니다.
FMK

7
@FMK 감사합니다! null bang 타입 변수의 값이 nullable 타입이 아닌 변수로 들어갈 수 있도록 double bang이 사용된다는 것을 알고 있습니까?
Sam

2
@david 네, 정확히.
FMK

10

더블 뱅 오퍼레이터 는 팬 NullPointerException(또는 짧은 경우 NPE) 팬에게 탁월한 옵션입니다 .

아닌 어설 션 연산자!! 는 모든 값을 아닌 유형으로 변환 하고 값이 널인 경우 예외를 발생시킵니다.

val nonNull = a!!.length

그래서 당신은 쓸 수 a!!있으며 이것은 null이 아닌 값을 반환 하거나 (예 a: String여기) NPE를 던질 것입니다.a 널 (null)입니다.

NPE를 원할 경우 NPE를 가질 수 있지만 명시 적으로 요청해야합니다. 개발자가 보증하는 경우이 연산자를 사용해야합니다. 값은 null이되지 않습니다 .


2
초보자에게 질문 : 왜 어떤 값을 null이 아닌 유형으로 변환하고 싶습니까?
Wolf359

4
@ Wolf359 값이 null이 아닌 것을 100 % 확신 할 수 있습니다. ( "그것은 NPE를 디버깅 및 null로 값을 설정 라인 / 실행 경로를 찾는 힘든 시간을 가지고 일반적인 문제입니다이 널 할당은 다른 문맥, 클래스 또는 하루에 발생할 수 있습니다.!"Cascader에 의해)
감소 활동
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.