【发布时间】:2020-02-06 21:11:03
【问题描述】:
由于 Kotlin 不允许隐式空值/变量,所以引入 KotlinNullPointerException 以显式表示由 !! 引起的 NPE?这是NullPointerException这个子类的唯一目的吗?
【问题讨论】:
标签: kotlin nullpointerexception
由于 Kotlin 不允许隐式空值/变量,所以引入 KotlinNullPointerException 以显式表示由 !! 引起的 NPE?这是NullPointerException这个子类的唯一目的吗?
【问题讨论】:
标签: kotlin nullpointerexception
从 1.3 版开始,Kotlin 仅在 !! 运算符检查失败的情况下抛出 KotlinNullPointerException。这将它与其他可能抛出 NullPointerException 的情况区分开来,例如,在类构造期间访问未初始化的成员时。
但是请注意,在 Kotlin 1.4 中,有计划消除这种区别:所有此类失败的检查将仅抛出 NullPointerException,因此其继承者 KotlinNullPointerException 将不再使用。您可以在 1.3.50 版本发布的公告博文中了解更多信息:https://blog.jetbrains.com/kotlin/2019/08/kotlin-1-3-50-released/
【讨论】:
KotlinNullPointerException 和 JavaNullPointerException 之间没有真正的区别。
方法如下:
KotlinNullPointerException 是一个扩展 NullPointerException 的 open 类现在这个 NullPointerException 是 typealias 的 java.lang.NullPointerException。
public open class KotlinNullPointerException : NullPointerException {
constructor()
constructor(message: String?) : super(message)
}
这是从TypeAlias.Kt中提取的一行
@SinceKotlin("1.1") public actual typealias NullPointerException = java.lang.NullPointerException
现在,如果我们看到 java.lang.NullPointerException 的声明,我们会被带到扩展 RuntimeException 的 Java.lang 类。
public
class NullPointerException extends RuntimeException {
private static final long serialVersionUID = 5162710183389028792L;
/**
* Constructs a {@code NullPointerException} with no detail message.
*/
public NullPointerException() {
super();
}
/**
* Constructs a {@code NullPointerException} with the specified
* detail message.
*
* @param s the detail message.
*/
public NullPointerException(String s) {
super(s);
}
}
在 Kotlin 中,要声明可空类型,您必须通过在声明类型末尾附加 ? 来明确允许它。示例:
var nullableString: String? = null
这是一种简单的说法,即此变量随时可能为空,因此,如果您尝试从代码的任何部分访问此变量,它将引发错误并迫使您采取措施防止NPE使用!!(如果为空则崩溃)或?(如果为空则跳过)。
这只是让它看起来更像“Kotlin”的一种方式。
【讨论】: