Kotlin : String이 null이고 double bang (!!) 연산자를 사용하면 왜 길이 함수에 대한 컴파일 오류가 발생합니까?

머리카락

예:

fun main(){
    var userInput: String?
    //userInput = null
    userInput = "asbdef"
    var inputLength:Int? = userInput!!.length
    println("Length of the string is :"+inputLength)
}

출력 : 문자열 길이 : 6

fun main(){
    var userInput: String?
    userInput = null
    //userInput = "asbdef"
    var inputLength:Int? = userInput!!.length
    println("Length of the string is :"+inputLength)
}

출력 : 미해결 참조 : 길이

왜 컴파일 오류가 발생하는지 알고 싶습니다.

(!!) 연산자를 (?)로 바꾸면 잘 컴파일되지만 출력은 null로 인쇄됩니다.

PS : 저는 Kotlin의 초보자입니다.

아담 밀러 칩

?.운영자 단락 경우 좌측으로 평가하여 null. 결과 정도의가 nullVariable?.length있다 null.length평가되지 않습니다. 첫 번째 예는 다음을 효과적으로 수행하는 것입니다.

println("Length of the string is :" + null)

!!운영자 "는 던져 말한다 NullPointerException왼쪽이 null의 경우. 그렇지 않으면, 우리가 오른쪽에 null이 아닌 것을 알고". 두 번째 예제를 약간 변경하면 이것을 볼 수 있습니다.

val userInput: String? = null
val inputLength:Int = userInput!!.length // throws NullPointerException

그러나 왜 당신이 Unresolved reference: length. 컴파일러가에 null직접 할당 할 때 일부 최적화를 수행하는 것처럼 보이 userInput므로 String?런타임에 NPE 를 발생시키는로 컴파일하는 대신 값이 컴파일 시간 에만 null(아님 String?) 임을 알고 있으므로 참조가 아니기 length때문 null입니다.

NullPointerException함수 호출을 통해 추상화 계층을 추가하여 강제로 제공 할 수 있습니다 .

fun main(){
    var userInput: String? = "foo"
    userInput = alwaysNull()
    val inputLength:Int = userInput!!.length // NullPointerException
}

fun alwaysNull(): String? = null

Null Safety 문서에서 한 줄로 초기화 / 함수 호출을 통한 동작과 nullvar에 직접 할당하는 것 사이의 차이점에 대해 아무것도 보지 못 하므로 내부에서 일어나는 일은 Unresolved reference추측에 불과합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관