问题标签 [kotlin-null-safety]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
41 浏览

kotlin - 如果变量不为空,则分配给变量的更简洁方法

我在 lambda 函数中有一些代码,如下所示:

有没有办法使用 let/with/apply/run 函数和 null 安全运算符来缩短此代码(减少引用字段的次数model.time,并在可能的情况下删除临时变量)?oldTime

不幸的是,放在model.time ?: return开头不起作用,因为它在 lambda 函数中。

0 投票
1 回答
220 浏览

kotlin - ?: ,零安全和猫王运算符的有效性?

我指的是 Kotlin 中的 Null-Safety

我的一个同事总是这样写道:

可读性是他的论点。这对我来说不是很喜欢 Kotlin,而且过于繁琐。我当然更喜欢:

一些不使用上层方式的参数/文档/链接会非常有帮助。

我想知道使用upper way是否有任何缺点?另外,我可以想象一些编译器优化不会很好地工作,做上面的方式?

编辑:根据 SVN,历史告诉我们:

0 投票
2 回答
195 浏览

android - 在 kotlin 中使用“let”时,我的变量名和“it”有什么区别?

在下面的代码片段中,两个代码块有什么区别?
如果我检查println(name==it),则返回 true,因此它们必须引用同一个对象,对吗?

但是,当 name 变量有值时,一切正常,但是一旦我将其设置为 null,代码块 1 就可以工作(这意味着 let 块根本不会被执行),但代码块 2 会抛出错误。为什么 kotlin 不只是跳过/忽略 Codeblock 2,什么时候name为空?

非常感谢,任何帮助表示赞赏。

0 投票
2 回答
368 浏览

kotlin - 可空变量和智能转换

考虑以下 Kotlin 块。

Android Studio 告诉我从Int?to的智能转换Int是不可能的,因为nullableInt它是可变的。我知道这可能是多线程代码中的问题。

处理该问题的一种方法是使用 进行显式强制转换 val checkedInt: Int = nullableInt!!,但如果我将在多线程环境中使用编码,则不建议这样做。


关闭重复项

关于这个主题有几个非常接近的问题。但是,在我发现的任何一个中,我都没有找到令人满意的答案:

在 Kotlin 中,处理可空值、引用或转换它们的惯用方法是什么,讨论了问题出现的原因,但没有提供有关如何处理它的建议

Kotlin Avoid smart cast for null check有一个 if-not-null 分支,它返回一个非空值,因此该?.let{} :? {}构造在那里工作。由于我的非空分支返回空值,因此两个分支都会运行。

Kotlin“智能转换是不可能的,因为此时属性可能已经改变”只关注非空分支和非空分支,因此?.let{}构造似乎是正确的。在那个线程中,他们提供了关于在if声明之前获取本地副本的建议,这在我的情况下也是可行的。不幸的是,它不是很优雅,我希望有其他选择。


有什么方法可以在不复制的情况下以空安全的方式处理这个空条件分支?

我知道答案可能是“视情况而定”。如果是这种情况,请说出来并详细说明原因。

0 投票
1 回答
74 浏览

kotlin - 在不详尽的情况下使用 Kotlin 的作用域函数 with / when

我很新,Kotlin我正在尝试弄清楚 Kotlin 的scope functions.

我的代码如下所示:

.let因此,在我使用函数进入第三次检查之前,我的with函数不需要详尽(我没有返回任何东西,我只是在做作业)。在我的第三次检查中,我将.let其用作空检查...但仅用于分配it.var3(如果不是null)。.let当我知道 Kotlin 的函数按标准返回正文的结果时,我不需要返回任何内容。

尽管如此,现在我with/when需要详尽无遗,否则它将不再编译。

这让我思考并尝试不同的事情。我找到了解决这个问题的这些方法:

  1. 我可以在elsemy中添加一个,with/when所以它变得详尽,但实际上我不需要 else,我不想在这种情况下使用它。
  2. 我可以添加另一个.let,所以它看起来像这样:myNullableVar?.let { it.var3 = "test789" }.let{}.... 但这对我来说看起来有点 hacky。它应该像这样工作吗?
  3. 使用If(xy==null){...}else{...}东西,但我认为我可以用 Kotlin 以不同的方式解决这个问题

因为我是 Kotlin 的新手,所以我不确定如何正确处理这种情况。我可能会选择我的第二个想法,因为“它有效”。还是我不应该.let用于空检查?添加另一个空的 . let{}? 还是我根本没有得到零安全概念?我觉得这里有点失落。谢谢你的帮助。

0 投票
1 回答
236 浏览

kotlin - Kotlin:如果 String 为 null 并且使用了 double bang(!!) 运算符,为什么它会给出长度函数的编译错误?

例子:

输出:字符串的长度为:6

输出:未解决的参考:长度

我想知道为什么它会产生编译错误?

如果我只是用 (?) 替换 (!!) 运算符,它编译得很好,但将输出打印为 null。

PS:我是 Kotlin 的新手

0 投票
1 回答
59 浏览

if-statement - 是什么让安全调用(问号)的解释与经典 if 不同?

Kotlin中,如果我们将一个类成员声明为var和可为的类型,编译器不允许我们运行该成员函数,尽管我们在调用该函数之前放置了一个 if 语句,因为编译器不能保证该成员不是在检查 null 之后和调用方法之前设置为 null。 但是如果我们使用安全调用编译器会批准我们的代码。我的问题,编译器如何使安全调用原子化?不是第二个线程可以在检查 null 和调用方法(示例中的吃方法)之间更改变量吗?第一种情况的代码:

第二种情况的代码:

0 投票
1 回答
48 浏览

kotlin - 为 var 类成员设置一个可以更改的新值是类型吗?

我很确定标题中问题的答案是否定的。但是我写了一个简单的代码,并在尝试编译时遇到了一个奇怪的错误。代码:

代码的最后一行:

println(hippo?.hunger) // println(hippo?.hunger as Int?) 有效!!

使编译器显示以下错误:

智能转换为 Int 是不可能的,因为 hippo?.hunger 是一个可变属性,此时本可以更改

但是,如果我删除以下行代码将被编译:

河马?饥饿= 5

有人可以解释一下,这行代码有什么问题导致代码无法成功编译?

在此处输入图像描述

0 投票
1 回答
428 浏览

kotlin - Kotlin "let{}" 不提供 Smart Cast

刚刚学习了替换操作的KotlinNullable类型和功能。let{}if (xx != null) {}

但是我感到困惑的一件事是,我们都知道并且我认为编译器应该知道,当我们使用时let{},调用此函数的变量/对象可能为空,但是编译器仍然要求我添加安全调用运算符“ ?” 在变量名之后,而不是if (xx != null) {}. 为什么?

我的一段代码:

0 投票
2 回答
797 浏览

kotlin - 在 Kotlin 中增加整数 Map 值

给定一个 Map 或 MutableMap:

我无法像在 Python 中那样增加这些,而且我不确定这样做的正确方法是什么,或者是否可能。

这给出了错误:

我不确定这里发生了什么。