Respostas:
Esta é T?
uma conversão de tipo anulável inseguro ( ) para um tipo não anulável ( T
),
!!
será lançada NullPointerException
se o valor for null
.
Está documentado aqui, juntamente com os meios de segurança nula da Kotlin.
sale.latest
pode conter null
; a atribuição será bem-sucedida somente se sale.latest
não for nula e lançará o NPE caso contrário. Isso fornece segurança nula para val price
: seu tipo será não nulo. Veja kotlinlang.org/docs/reference/null-safety.html
!!
você pode executar uma falha rápida e localizar a causa raiz de um NPE. Eu gostaria que o Java tivesse um recurso semelhante (ou seja, sem if
declarações e / ou assert
íons feios ).
Aqui está um exemplo para tornar as coisas mais claras. Digamos que você tenha essa função
fun main(args: Array<String>) {
var email: String
email = null
println(email)
}
Isso produzirá o seguinte erro de compilação.
Null can not be a value of a non-null type String
Agora você pode impedir isso adicionando um ponto de interrogação ao String
tipo para torná-lo anulável.
Então nós temos
fun main(args: Array<String>) {
var email: String?
email = null
println(email)
}
Isso produz um resultado de
null
Agora, se queremos que a função gere uma exceção quando o valor do email for nulo, podemos adicionar duas exclamações no final do email. Como isso
fun main(args: Array<String>) {
var email: String?
email = null
println(email!!)
}
Isso lançará um KotlinNullPointerException
O operador de golpe duplo é uma excelente opção para os fãs de NullPointerException
(ou NPE, para abreviar).
O operador de asserção não nulo
!!
converte qualquer valor em um tipo não nulo e lança uma exceção se o valor for nulo.
val nonNull = a!!.length
Portanto, você pode escrever a!!
e isso retornará um valor não nulo de a
(um String
aqui por exemplo) ou lançará um NPE sea
for nulo.
Se você deseja um NPE, pode obtê-lo, mas precisa solicitá-lo explicitamente. Esse operador deve ser usado nos casos em que o desenvolvedor está garantindo - o valor nunca será nulo .
!!
está no final de uma declaração? A conversão automática de IJ para Kotlin fez isso por mimval price = sale.latest!!