nullpointerexception - 猫王运算符与非空断言:这些语句之间的区别?
问题描述
试图理解 Kotlin 中的 null 安全性:以下这两个语句似乎都可以正常工作并且在我的程序中可以互换:
var y1: Double = 0.0
get() = when(hasParent) {
true -> parent!!.y1
else -> field
}
和
var y1: Double = 0.0
get() = parent?.y1!!
(hasParent
只是一个查看是否parent
为空的吸气剂)
这两个在语义上是相同的,还是它们实际上是不同的表达方式,意味着不同的事物?如果它们在语义上的意思相同,那么出于某种原因,第一个是否比第二个更受欢迎?
解决方案
在这种情况下,您不需要hasParent
. 适用的形式是这样的:\
var y1: Double = 0.0
get() = parent?.y1 ?: field
parent.y1
你的第二个 getter 的问题是它无论如何都会尝试返回,NullPointerException
如果它不存在它会抛出 a 。
如果您使用 IDEA,您将收到此类问题的警告,因此它们很容易解决,但您需要了解来自 Java 代码的所谓平台类型:
val queue: Queue<String> = LinkedList()
queue.peek().toInt()
尽管.toInt()
可以从Queue
. 我在这里写过这个。
推荐阅读
- javascript - Object.assign 什么时候返回 false
- microsoft-graph-api - 使用 $filter 的过滤子句无效
- javascript - 如果节点不存在则创建节点,否则追加返回的html
- python - 我开始相信我的 python 安装坏了
- ruby-on-rails - 如何创建双多态关联
- c# - 在实体框架 6 中使用 DateTime 时出错
- ios - 如何以编程方式或其他方法跟踪我的 iOS 应用程序的蜂窝数据使用情况?
- azure - 用于 az 命令“az iot edge set-modules”的 Iot-edge Rest API
- cordova - 无法运行“javac -version”,请确保您已安装 JDK 版本 8
- angular - 解析错误,将管道移动到共享模块时