KotlinNullPointerException和Java的NullPointerException有什么区别?

5
由于Kotlin不允许使用隐式的空值/变量,因此引入了KotlinNullPointerException以明确表示由!!引起的NPE。这个子类的唯一目的是吗?
2个回答

3

KotlinNullPointerExceptionJavaNullPointerException之间没有实质性的区别。

下面是原因:

KotlinNullPointerException是一个继承自NullPointerExceptionopen类。现在这个NullPointerExceptionjava.lang.NullPointerExceptiontypealias

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的声明,我们会进入一个扩展了RuntimeExceptionJava.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”。

1
我认为这个问题是在问,如果没有区别,为什么还要创建它。 - Diego Marin Santos
谢谢您的回答,我觉得很有帮助。也许我没有正确地表达问题,但我认为下面Ilya的回答就是我要找的。 - Matej

2
从版本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/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接