Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin编译器可空性检查_Kotlin - Fatal编程技术网

Kotlin编译器可空性检查

Kotlin编译器可空性检查,kotlin,Kotlin,我是一个kotlin新手,想知道为什么kotlin编译器不知道我的变量永远不会为null,以及如何以最好的方式绕过它 var myString: String? = null val myList = mutableListOf<String>() for (element in 1..2) { if(myString == null) { myString = if(*somecondition*) "a" else "b"

我是一个kotlin新手,想知道为什么kotlin编译器不知道我的变量永远不会为null,以及如何以最好的方式绕过它

var myString: String? = null
val myList = mutableListOf<String>()
for (element in 1..2) {
   if(myString == null) {
       myString = if(*somecondition*) "a" else "b"
   }
   //compiler error, cannot infer type String? to String
   myList.add(myString)      
}
var myString:String?=无效的
val myList=mutableListOf()
for(1..2中的元素){
if(myString==null){
myString=if(*somecondition*)“a”else“b”
}
//编译器错误,无法将类型字符串?推断为字符串
myList.add(myString)
}

一点解释和如何处理这些案件的最佳方式将是很好的

因为
String?
String
是两种不同类型的变量(或常量)。访问变量时变量的值可能已被另一个线程/协同程序更改。在你的情况下,我会这样做:

var myString: String? = null
val myList = mutableListOf<String>()
for (element in 1..2) {
   myList.add(myString ?: if (/* condition */) "a" else "b")      
}
var myString:String?=无效的
val myList=mutableListOf()
for(1..2中的元素){
myList.add(myString?:if(/*条件*/)“a”或“b”)
}

升级到最新的编译器版本后,问题中提到的代码将被编译。

您只需将其设置为myList.add(myString!!)the!!运算符告诉编译器,即使类型可为null,程序员也确信该值在此特定位置不会为null,因此如果找到null值,则应执行null检查并抛出NPE。@Rickky13谢谢-我知道我可以做到这一点。我也知道!!不应该真正使用,因为编译器通常会推断某个值是否为null(当它如此明显时)。另一个线程可能已将该值更改为null。在这种特殊情况下不是这样,但编译器无法知道这一点。但真正的问题是,为什么一开始它可以为空?只需将其初始化为空字符串,并将其用作第一个检查。或者你甚至不能初始化它,使用反射来检查它是否被初始化,而不是检查它是否为null(我绝对不建议这样做,但这是一个选项);myString=toAdd;myList.add(toAdd)