3

Kotlin 在编译时使用“可空?”的分离进行了出色的空检查。和“不可为空”的对象。它有一个 KAnnotator 来帮助确定来自 Java 的对象是否为 nullabale。但是,如果不可为空的类的某些部分被更改了怎么办?

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

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()
}

调用 cat.mew()时,由于 null,我们在 kotlin 中得到了一个运行时错误:

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

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

PS 像 KAnnotator 这样的东西在你的代码中寻找这样的东西吗?

4

1 回答 1

3

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

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

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

于 2014-02-21T21:15:49.893 回答