我是Kotlin Programming lang的新手。
我一直在用android开发应用程序。
我找到了一个带有String?
和String
构造函数的数据类
任何人都可以让我理解这一点。
data class Person(var name: String?) {
//...
}
data class Person(var name: String) {
//...
}
答案 0 :(得分:8)
当您使用?
时,它会告诉您,您也可以使用空值。因为Kotlin强制执行null safety。
请参阅以下代码中的评论:
data class Person(var name: String?) { // This can have null value also
//...
}
data class Person(var name: String) { // This can not have a null value, it will give compile time error.
//...
}
答案 1 :(得分:5)
String?
可以为null,String
不能为空,这就是它的所有内容。
答案 2 :(得分:2)
“?”运算符定义变量的无效能力。
示例:
接受字符串类型,但也接受空值。
var x :String? = ""
x = null // works fine
只接受String类型,如果您打算将其值设置为null,则会引发编译错误。
var x :String = ""
x = null // will provoke a compilation error.
在检查变量的空值后,请记住它将自动转换为非可空类型。
fun test() {
var x: String? = ""
x = null // works fine
x = "String type" // works fine
if(x == null) {
println("The var x can't be null")
return
}
x = null // will provoke a compilation error.
}
fun main(args: Array<String>) {
test()
}
答案 3 :(得分:0)
用?声明的变量表示变量可能是也可能不是为空。
否则,它被解释为非空值。
此功能已明确添加到Kotlin以减少/防止常见的运行时错误, NullPointerException 。
例如:
var a: String? = "abc"
a.length // Compile Time Error, trying to access possibly null value
var b: String = "xyz"
b.length // No Error, the value is never null
话虽如此,您可以使用!!
声明值不为空,这将删除编译器错误,但会增加NPE的风险:
var a: String? = "abc"
a!!.length // Will cause Run Time Exception if a is null
答案 4 :(得分:-3)
?
适用于 kotlin 的安全投射操作员。
例如。如果我们有一个演员操作,如:
val x: String = y as String
如果y
为null
,则上述代码将引发异常。为避免这种情况,我们可以使用安全强制转换运算符(?
)。上面的代码段变成:
val x: String? = y as? String
如果在施法时出现任何类型的失败,这将返回null
。
请在此link