예:
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 문서에서 한 줄로 초기화 / 함수 호출을 통한 동작과 null
var에 직접 할당하는 것 사이의 차이점에 대해 아무것도 보지 못 하므로 내부에서 일어나는 일은 Unresolved reference
추측에 불과합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다