- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我是 Kotlin 的新手,我读到它似乎是继轮子之后最好的发明。无论如何,这让我感到怀疑,当然是因为我没有理解这个概念所暗示的一切。
恢复我的理解,在我们有 NullPointerException
之前,非常清楚地知道代码中的某些问题以及问题发生的位置,而不是设置 null 的位置。无论如何,很明显我们可以在这里等到空指针返回,期望从回溯中了解发生了什么。每个人都已经这样做了,这是永远不可能找到的。
现在有了空指针安全,我们不再有这样的崩溃,只是部分代码不会在我们的应用程序中静默执行(当然,我们假设使用的引用不应该像以前那样为空) ,可能会导致奇怪的行为比之前的 NullPointerException
更难以理解,或者可能只是一些任务在有人意识到之前没有执行一个月。
这是 Null Pointer Safety 提供的好处吗?
最佳答案
我假设您来自 Java,您已经在其他地方看过一些解释,但并没有完全理解它们。因此,我不会试图给你一个全面的解释(你可以在其他地方找到),而是我会尝试明确空指针安全的核心思想。
有两点,如果你理解的话,应该足够清楚。首先,有两种不同的类型来表示您将在 Java 中建模为单一类型的想法:可空类型和不可空类型。举个例子,在 Java 中,您将字符串放在 String
中。对象,不关心字符串是否可以为空,在 Kotlin 中有两种类型:String?
和 String
.第一个接受 null 值(如 Java 等效项),但第二个不接受。因此,您可以在具有 ?
的类型中具有空值(例如 String?
或 Int?
),但是对于您可以使用它们执行的操作有很多限制:基本上您只能使用 null 执行的操作,因为毕竟变量可能包含空值。因此,例如,没有调用方法。因此,在 Java 中,您可以在其上调用方法并获得 NullPointerException
有时,在 Kotlin 中你不能调用任何方法。这并不是因为 Kotlin 的一些沉默行为,它比这简单得多:编译器不会让你这样做。试一下,你会发现程序没有编译通过。如果变量的类型为 String
而不是 String?
那么 Kotlin 将允许您从中调用方法。
因此,基本上没有空指针异常,因为您永远不能在可能为空的对象变量上调用方法。
但是,有时变量不为空:那么在变量不为空的情况下,如何调用变量上的方法呢?同样,答案很简单:您必须检查它。我的意思是,你必须使用 if
将检查变量是否为空的指令(显式或隐式)。像“if (myVariable != null) {call method on variable}
”。因此,如您所见,Kotlin 编译器足够聪明,可以看到您使用了 if
保证变量不为空的指令,因此它将允许您在 {
之间的 block 中调用变量上的方法和 }
.换句话说,如果你的变量是 String?
但你在 if
内检查变量不为空的 block ,Kotlin 会将其视为 String
类型的变量而不是 String?
当你谈到
some part the code which silently won't be executed
我猜您正在考虑一些具有隐式 if
的运算符在它们里面,就像 ?.
运算符(operator)。如果你写
myVariable?.call()
大概意思
if (myVariable != null) { myVariable.call()}
因此,确实,如果变量为空,它会默默地“失败”。但是如果你使用同一种if
,这与Java没有什么不同。 .换句话说,如果变量为 null,则不会发生任何事情,因为您已将其显式编码为这样。
关于null - 零安全的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49536985/
最近开始学习oracle和sql。 在学习的过程中,我遇到了几个问题,我的 friend 在接受采访时被问到这些问题。 SELECT * FROM Employees WHERE NULL IS N
这个问题在这里已经有了答案: Can we subtract NULL pointers? (4 个回答) 关闭 2 个月前。 是否定义了NULL - NULL? (char *)NULL - (ch
是否有推荐的方法(根据 .net Framework 指南)检查 null,例如: if (value == null) {//code1} else {//code2} 或 if (value !=
我正在尝试将值插入数据库,但出现这样的错误任何人都可以告诉我为什么该值为空,如下所示: An exception occurred while executing 'INSERT INTO perso
这个问题在这里已经有了答案: String concatenation with a null seems to nullify the entire string - is that desire
您好,我正在 Android 联系人搜索模块中工作。我正在查询下方运行。 cur = context.getContentResolver().query(ContactsContract.Data.
下面的 SQL 表定义说明了从我的 MYSQL 数据库创建表的语句之一,该数据库是由我公司的前开发人员开发的。 DROP TABLE IF EXISTS `classifieds`.`category
我主要有应用程序开发背景。在编程语言中 variable == null或 variable != null有效。 当涉及到 SQL 时,以下查询不会给出任何语法错误,但也不会返回正确的结果。 sel
我在尝试检查某些元素是否为 NULL 时遇到段错误或不。任何人都可以帮忙吗? void addEdge(int i, int j) { if (i >= 0 && j > 0)
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
下面查询的关系代数表达式是什么?我找不到“Is Null”的表达式。 SELECT reader.name FROM reader LEFT JOIN book_borrow ON reader.ca
我正在尝试使用三元运算符来检查值是否为 null 并返回一个表达式或另一个。将此合并到 LINQ 表达式时,我遇到的是 LINQ 表达式的 Transact-SQL 转换试图执行“column = n
我在给定的代码中看到了以下行: select(0, (fd_set *) NULL, (fd_set *) NULL, (fd_set *) NULL, &timeout); http://linux
var re = /null/g; re.test('null null'); //> true re.test('null null'); //> true re.test('null null')
这个问题在这里已经有了答案: 关闭 13 年前。 我今天避开了一场关于数据库中空值的激烈辩论。 我的观点是 null 是未指定值的极好指示符。团队中有意见的其他每个人都认为零和空字符串是可行的方法。
由于此错误,我无法在模拟器中运行我的应用: Error:null value in entry: streamOutputFolder=null 或 gradle - Error:null value
我正在尝试在 Android 应用程序中创建电影数据库,但它返回错误。知道这意味着什么吗? public Cursor returnData() { return db.query(TABLE
我一直在检查浏览器中的日期函数以及运行时间 new Date (null, null, null); 在开发工具控制台中,它给出了有效的日期 Chrome v 61 回归 Sun Dec 31 189
为什么 NA==NULL 会导致 logical (0) 而不是 FALSE? 为什么 NULL==NULL 会导致 logical(0) 而不是 TRUE? 最佳答案 NULL 是一个“零长度”对象
我是一名优秀的程序员,十分优秀!