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 

如果ynull ,则上面的代码将抛出exception。 为了避免这种情况,我们可以使用安全的cast操作符( ? )。 以上片段变成:

 val x: String? = y as? String 

如果在投射时出现任何故障,这将返回null 。 请在这个链接find阅读