var name:String有什么区别? 和var name:String
我是Kotlin Programming lang的新手。 我一直在android开发应用程序。 我发现一个数据类采用String?
构造函数String?
和String
任何人都可以让我明白这一点。
data class Person(var name: String?) { //... } data class Person(var name: String) { //... }
String?
可以为null, String
不能为null,这就是所有的事情。
当你使用?
它告诉,你也可以有空值。 因为Kotlin强制执行无效安全 。
请参阅以下代码中的注释:
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. //... }
“?” 运算符定义variables的无效能力。
例子:
接受字符串types,但也接受空值。
var x :String? = "" x = null // works fine
只接受字符串types,如果你打算将它的值设置为null会引发编译错误。
var x :String = "" x = null // will provoke a compilation error.
检查variables的空值后,记住这一点非常重要,它将自动转换为非空值types。
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) { test() }
Kotlin文档,无效安全
一个variables声明? 表示该variables可能是或者可能不是 null。
否则,它被解释为一个非空值。
Kotlin明确增加了这样一个function,以减少/防止一个常见的运行时错误,即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
这个?
将是安全铸造操作员kotlin 。 例如。 如果我们有一个类似的演员阵容:
val x: String = y as String
如果y
为null
,则上面的代码将抛出exception。 为了避免这种情况,我们可以使用安全的cast操作符( ?
)。 以上片段变成:
val x: String? = y as? String
如果在投射时出现任何故障,这将返回null
。 请在这个链接find阅读