从 Kotlin 调用 Java 方法时,如何安全地处理 null 值?

How can I safely handle null values when calling Java methods from Kotlin?

提问人:Stammenator 提问时间:5/23/2023 最后编辑:Stammenator 更新时间:5/23/2023 访问量:162

问:

当与没有 null 安全的 Java 库连接时,如何在 Kotlin 中处理 null 安全?

通过研究,我发现这些东西“有效”,但并不安全。

  1. 将 Kotlin 的非 null 类型与返回 null 的 Java 方法一起使用:

  2. 将运算符与返回 null 的 Java 方法一起使用:!!

  3. 假设 Java 布尔值永远不会为 null:在 Java 中,可以是 、 或 ,但在 Kotlin 中,只能是 或 。BooleantruefalsenullBooleantruefalse

在这些示例中,我的 Kotlin 编译器不会显示错误,因为它没有足够的关于 Java 方法是否可以返回 null 的信息。

java kotlin nullpointerexception kotlin-null-safety

评论

0赞 DavidT 5/24/2023
TBH,Kotlin 与 Java 的接口非常干净,通常需要格外注意的 3 个方面是:可空性、可变性(不可变列表等)以及 Java 库构造新 Kotlin 对象的情况(如何传入类对象和后期初始化的使用等)。
1赞 gidds 5/24/2023
正如问题、评论和答案所示,您有很多选择。选择哪一个取决于以下情况:如果 Java 代码返回 null,而 Kotlin 代码期望非 null,您希望发生什么?具有特定有用消息的直接例外?立即泛型 NullPointerException?没有例外,除非/直到您尝试使用该值?默认值?绕过任何尝试使用该值的代码?— 所有这些都是可能的,而且在正确的情况下,大多数都是有意义的。

答:

5赞 Tenfour04 5/23/2023 #1

像在 Java 中一样对待它。假设该值可能为 null,除非从中获取该值的方法的文档声明它不会为 null。如果它没有声明它不会返回 null,则它是可为 null 的。将其完全视为可为 null 的 Kotlin 变量。因此,请根据具体情况使用 、 、 或。?.?:if (foo != null).orEmpty()

Java 还具有不可为 null 的 、 、 、 、 和 。如果看到小写类型,则知道它不可为 null。booleanlongintcharbytedoublefloat