fun handle() : String {
null?.let { return "Ololo"}
}
val result = handle()
result.trim() // kotlin.TypeCastException: null cannot be cast to non-null type kotlin.CharSequence
有什么想法,为什么 Kotlin 的 null 安全函数会返回 null?
fun handle() : String {
null?.let { return "Ololo"}
}
val result = handle()
result.trim() // kotlin.TypeCastException: null cannot be cast to non-null type kotlin.CharSequence
let
不执行的情况下添加了 null
返回。这可能是一个 bug,因为它不应该被编译,并且在之前的 Kotlin 版本中也不会被编译。@NotNull
public final String handle() {
return null;
}
我认为这只是编译器的优化,因为null?.let()
永远不会被执行。
使用实际变量会产生以下结果:
@NotNull
public final String handle() {
return someNullableVariable != null ? "Ololo" : null;
}
let()
的引用是null
,则不会执行它。然而,由于该函数需要返回某些内容,编译器只能告诉它返回null
,因为没有其他可返回的东西。@NotNull
,Kotlin将对任何引用该函数的内容执行空值检查:fun someOtherMethod() {
handle().trim()
}
变成
public final void someOtherMethod() {
String handle = handle();
if (handle != null) {
StringsKt__StringsKt.trim(handle).toString();
return;
}
throw new Exception("null cannot be cast to non-null type kotlin.CharSequence");
}
有两种处理方式。您可以将handle()
的返回类型更改为String?
:
fun handle(): String? {
someNullableVariable?.let { return "Ololo" }
}
如果变量为空,您可以返回其他内容:
fun handle(): String {
someNullableVariable?.let { return "Ololo" }
return "someNullableVariable was null"
}
let
的lambda不会被调用。String
为返回类型的函数不应该返回null
。fun handle() : String {
null?.let { return "Ololo"}
}
错误:(6,0)在具有块体({...})的函数中需要“return”表达式
在Kotlin 1.3.11中需要。
无论如何:
let
不会被调用,因为安全调用运算符?
评估为null
(在这种情况下)。
let
块内部仅使用return
,如果未执行该块,则不会返回任何内容。由于它从未执行,因此实际上没有返回任何内容。fun handle() : String { }
本来就不应该编译通过,因为存在不返回的可能性。也就是说,除非Kotlin现在返回默认值(如果未指定),但那将非常奇怪。看起来像是一个错误。 - Zoe stands with Ukraine
String?
。 - RussHWolflet()
只有在其引用不为null时才应运行,这意味着实际上缺少了一个return
语句。不过,目前似乎编译器只是添加了一个return null
。 - TheWandererreturn null?.let { ... }
。 - RussHWolf