【问题标题】:What's the difference between KotlinNullPointerException and Java's NullPointerExceptionKotlinNullPointerException 和 Java 的 NullPointerException 有什么区别
【发布时间】:2020-02-06 21:11:03
【问题描述】:

由于 Kotlin 不允许隐式空值/变量,所以引入 KotlinNullPointerException 以显式表示由 !! 引起的 NPE?这是NullPointerException这个子类的唯一目的吗?

【问题讨论】:

    标签: kotlin nullpointerexception


    【解决方案1】:

    从 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/

    【讨论】:

      【解决方案2】:

      KotlinNullPointerExceptionJavaNullPointerException 之间没有真正的区别。

      方法如下:

      KotlinNullPointerException 是一个扩展 NullPointerExceptionopen 类现在这个 NullPointerExceptiontypealiasjava.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 的声明,我们会被带到扩展 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”的一种方式。

      【讨论】:

      • 我相信问题是问如果没有差异,为什么要创建它。
      • 感谢您的回答,我觉得它提供了丰富的信息。也许我没有正确地提出这个问题,但我认为下面 Ilya 的答案是我正在寻找的答案。
      猜你喜欢
      • 2011-06-02
      • 2010-09-19
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 2022-12-04
      • 2021-10-12
      相关资源
      最近更新 更多