var name:String之间有什么区别?和var name:String

时间:2017-05-22 05:28:23

标签: kotlin

我是Kotlin Programming lang的新手。 我一直在用android开发应用程序。 我找到了一个带有String?String构造函数的数据类 任何人都可以让我理解这一点。

data class Person(var name: String?) {
//... 
}
data class Person(var name: String) {
//...
}

5 个答案:

答案 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()
}

Kotlin Documentation, null-safety

答案 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

如果ynull,则上述代码将引发异常。为避免这种情况,我们可以使用安全强制转换运算符(?)。上面的代码段变成:

val x: String? = y as? String

如果在施法时出现任何类型的失败,这将返回null。 请在此link

找到阅读材料