【问题标题】:Java modifies kotlin class content to nullJava修改kotlin类内容为null
【发布时间】:2014-03-23 07:16:45
【问题描述】:

Kotlin 在编译时使用与“可为空?”的分离进行出色的空检查。和“不可为空”的对象。它有一个 KAnnotator 来帮助确定来自 Java 的对象是否为空。但是如果不可空类的某些部分发生了变化呢?

假设我们有一只猫,它肯定有一个可以喵喵叫的头。当我们让猫喵喵叫时,它会用头喵喵叫:

package org.cat

class CatHead(){
    fun mew(){
        println("Mew")
    }
}

class Cat(){
    var head = CatHead()
    fun mew(){
         head.mew()
    }
}

fun main(args:Array<String>){
   val cat = Cat()
   cat.mew()
}

现在让我们在这张漂亮的图片中添加一个 JAVA 猫疯子 (CatManiac.java),他在得到时会砍掉一只猫的头:

import org.cat.*;

public class CatManiac {
    public static void cutCatHead(Cat cat){
         cat.setHead(null);
    }
}

所以如果我们把一只猫交给一个疯子,他肯定会砍掉它的头。没有头的猫怎么叫喵?

fun main(args:Array<String>){
   val cat = Cat()
   CatManiac.cutCatHead(cat)
   cat.mew()
}

我们在 kotlin 中收到 runtime 错误,因为 null,点调用 cat.mew():

Exception in thread "main" java.lang.IllegalArgumentException". 

我相信这是我们在 Kotlin 中使用 Java 库时经常遇到的问题。有什么方法或计划来警告/与之抗争吗?

附:像 KAnnotator 这样的东西在你的代码中寻找这样的东西?

【问题讨论】:

    标签: nullpointerexception runtime kotlin


    【解决方案1】:

    Java 代码检查器最终将扩展为 Kotlin 代码。

    例如,IntelliJ 中的那个会立即警告您该问题。它是开源社区版的一部分,您可以自己尝试一下。

    同时请注意,与 Java 相比,Kotlin 为您提供了一个很大的优势:它在引入错误的地方失败了。很难通过许多 Kotlin 调用传递空值,然后才会失败。在 Kotlin 中,您通常会在第一次引入非法 null 时遇到运行时错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      相关资源
      最近更新 更多