标签: kotlin-null-safety

对Kotlin的Null Safety感到困惑

我是Kotlin的新手并且已经多次读过Kotlin的Null Safety,但我真的很困惑,并且不清楚.谁能帮我回答下面的问题:

  1. 什么!字符fun getString(key: String!)意味着什么?

  2. 以下运算符的名称是否正确:

?.:安全呼叫运营商

?::猫王运营商

!!:当然是运营商

  1. ?:运营商和?.let?之间有什么区别?我什么时候应该使用每一个?

kotlin kotlin-null-safety

3
推荐指数
1
解决办法
838
查看次数

Kotlin中功能变量的空安全运算符

在我的Kotlin应用程序中,我有像这样的可空变量

private var myCallback : (() -> Unit)? = null
Run Code Online (Sandbox Code Playgroud)

是否可以使用null安全运算符?来调用它?这给了我一个编译错误.

myCallback?()
Run Code Online (Sandbox Code Playgroud)

如果它不是空的话,我发现只有这种丑陋的方式

 if(myCallback != null)
     myCallback!!()
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-null-safety

3
推荐指数
1
解决办法
83
查看次数

从kotlin中的集合中过滤掉非空值

看看这个kotlin one liner:

val nonNullArr : List<NonNullType> = nullArray.filter {it != null}
Run Code Online (Sandbox Code Playgroud)

编译器在此行给出类型错误,表示无法将空列表分配给非空值列表.但过滤条件确保列表仅包含非空值.有没有类似于!!运算符的东西,我可以在这种情况下使用这个代码编译?

null nullable kotlin kotlin-null-safety

3
推荐指数
1
解决办法
809
查看次数

什么都没有用?

我专门要求非空类型Nothing

我确实知道,Nothing?例如,它允许我们过滤null以使重载明确无误,但我一直在努力思考Nothing有用的实例。

Nothing?可以只有一个值null。因此Nothing可以完全没有价值。重点是什么?为什么不简单使用Unit

types kotlin kotlin-null-safety

3
推荐指数
1
解决办法
87
查看次数

我可以将带null检查的when更改为其他方法吗?

在Kotlin中,还有其他的“ Kotlin”方法可以执行以下操作吗?

fun parse(inputSample: Sample): List<String> = 
   when {
     inputSample.foo != null -> parse(inputSample.foo)
     inputSample.bar != null -> parse(inputSample.bar)
     else -> emptyList()
  }
Run Code Online (Sandbox Code Playgroud)

我怀疑nullwith的支票when可以用Kotlin写成不同的形式

kotlin kotlin-null-safety

3
推荐指数
1
解决办法
58
查看次数

如何在Android Activity上使用Kotlin扩展函数正确执行空检查

我是Kotlin的新手,并尝试将我们现有代码库中的众多Android Util方法之一转换为Kotlin扩展函数.

这是Kotlin代码:

fun Activity?.isAlive(): Boolean {
    return !(this?.isFinishing ?: false)
}
Run Code Online (Sandbox Code Playgroud)

这意味着相当于这个Java方法:

public static boolean isAlive(Activity activity) {
    return activity != null && !activity.isFinishing();
}
Run Code Online (Sandbox Code Playgroud)

不过,我仍然获得NPEs在科特林代码每当Activitynull.关于我哪里出错的任何想法?

java android kotlin kotlin-android-extensions kotlin-null-safety

2
推荐指数
1
解决办法
583
查看次数

什么时候我应该使用let {}和什么时候只是普通!= null

你会如何以更科学的方式编写以下代码?

var returnValue = ...
val s3data = presignedUrl.body()
if (s3data != null) {
    val uploadImage = api.uploadImage(s3data.bucketUrl, s3data.awsAccessKeyId, s3data.policy, s3data.key, s3data.signature, body).execute()
    if (!uploadImage.isSuccessful) {
        crashReporterService.sendIssue("Failed uploading file", "Failed uploading file ${uploadImage.raw()}")
        returnValue = Result.FAILURE
    } else {
        returnValue = Result.SUCCESS
    }
} else {
    crashReporterService.sendIssue("Failed uploading image", "Error - ${presignedUrl.raw()}")
    returnValue = Result.FAILURE
}

return returnValue
Run Code Online (Sandbox Code Playgroud)

我可以使用let,但我觉得它使代码更难理解

kotlin kotlin-null-safety

2
推荐指数
1
解决办法
871
查看次数

Kotlin中零安全的最佳实践

我目前正在学习Kotlin,以在我的android应用程序中替换Java,但正在努力确保安全性。

我已经熟悉处理null和non-null变量的过程,但是,我仍然不确定Kotlin中实现null / non-null变量方面的“最佳实践”。

例如,在Java中,我将编写如下内容:

UserAccount account;

if (account == null) {
    openLogin();
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以在Kotlin中复制此语言,但似乎该语言旨在避免这种做法。我应该如何通过Kotlin实施此系统,我应该添加可为空的变量吗?

kotlin kotlin-null-safety

2
推荐指数
2
解决办法
1583
查看次数

为什么这个不可为空的val变得"可以为空"?

所以我有一个简单的回调类:

class Callback<T>(
    val onResponse: (T) -> Unit,
    val onError:(Throwable)->Unit
)
Run Code Online (Sandbox Code Playgroud)

现在我想实现一个处理错误的方法.可能会或可能不会callback需要调用.

private fun handleServerError(error:IServerError, callback:Callback<*>? = null){
    val reason = error.cause

    when(reason){
        is Because.ServerRejectsLogin -> {
            doAsync { uiThread { mainActivity.longToast("sorry, your session timed out. please log in again.") } }
            IntentManager.doLogin(mainActivity)
        }
        else -> callback?.onError(reason)
    }
}
Run Code Online (Sandbox Code Playgroud)

这给我一个错误:

Reference有一个可以为null的类型((Throwable) -> Unit)?使用explicit ?.invoke()来进行类似函数的调用

它似乎期待的是

else -> callback?.onError?.invoke(reason)
Run Code Online (Sandbox Code Playgroud)

而且我不太明白为什么.不应该callback是非空的事实足以导致必须有一个非空onError函数?

如果我写的话,加上侮辱伤害

else -> callback?.let{it.onError(reason)}
Run Code Online (Sandbox Code Playgroud)

然后它接受了但不是在警告我我应该之前

删除多余的.let电话

lambda type-inference callback kotlin kotlin-null-safety

2
推荐指数
1
解决办法
58
查看次数

使用 null 键获取映射

当涉及到地图时,我对 Kotlin 的 null 安全功能感到困惑。我有一个Map<String, String>。但我可以打电话map.get(null),它会返回null以指示地图中不存在该钥匙。我预计会出现编译器错误,因为map是 aMap<String, String>而不是Map<String?, String>. 我怎么可以通过null争论String呢?

还有一个相关的问题:是否有任何类型的 Map,无论是 stdlib 还是第三方实现,NullPointerException如果我调用,可能会抛出异常get(null)?我想知道对于 的任何有效实现,调用map.get(s)而不是,是否安全。s?.let { map.get(it) }Map

更新

编译器确实返回了一个错误map.get(null)。但这并不是因为空安全,而是因为文字null没有向编译器指示所传递参数的类型。我的实际代码更像是这样的:

val map: Map<String, String> = ...
val s: String? = null
val t = map.get(s)
Run Code Online (Sandbox Code Playgroud)

上面的代码编译良好,并返回null. 当键应该是String不可空的时,为什么会这样呢?

kotlin kotlin-null-safety

2
推荐指数
1
解决办法
2457
查看次数