В чем разница между именем var: String? и имя var: String

Я новичок в программировании программирования Kotlin. Я занимаюсь разработкой приложений в Android. Я нашел класс данных, берущий конструктор со String? и String Может ли кто-нибудь заставить меня понять это.

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

String? может быть нулевым, а String не может быть нулевым, вот и все.

Когда вы используете ? , он говорит, вы также можете иметь нулевое значение. Потому что Котлин обеспечивает нулевую безопасность .

См. Комментарии в следующем коде:

 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. //... } 

«?» оператор определяет нулевую способность переменной.

Примеры:

Примите тип String, но также принимайте нулевое значение.

 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 для уменьшения / предотвращения общей ошибки времени выполнения, 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 

? будет для безопасного литья оператора для котлина . Напр. если у нас есть операция литья, например:

 val x: String = y as String 

и если y равно null , то указанный выше код выдает исключение. Чтобы этого избежать, мы можем использовать безопасный оператор литья ( ? ). Вышеприведенный фрагмент:

 val x: String? = y as? String 

Это вернет null если во время каста есть какой-либо сбой. Пожалуйста, прочитайте эту ссылку по этой ссылке.