【发布时间】:2020-01-21 15:11:34
【问题描述】:
这里是 Kotlin 新手!
我刚刚将一些 Java 测试代码转换为 Kotlin,而空代码的特定情况目前正在困扰着我。我正在尝试测试(在 Kotlin @Test 代码段中)这个 java 函数是否引发了正确的 InvalidParameterException:
void addEventListener(
@NonNull DeviceEventListener listener,
@Nullable CompletionListener completionListener);
所以这个函数是通过 Kotlin 代码(在从 java 转换为 kotlin 之前运行良好)调用的,如下所示: 在 Java 之前:
deviceTest.addEventListener(null, testCompletionListener);
waiter.expect(InvalidParameterException.class);
测试运行良好,没有错误。
转换到 Kotlin 后,代码变得无法访问或引发 KotlinNullPointerException:
deviceTest!!.addEventListener(null!!, testCompletionListener)
waiter!!.expect(InvalidParameterException::class.java)
我是 Kotlin 的新手,对如何让它像以前在 Java 中那样工作感到很困惑。 有什么想法吗?
感谢您抽出宝贵时间!
【问题讨论】:
-
为什么要将空参数传递给不可为空的字段?另外,
!!如果在 null 上调用它会抛出一个空指针异常。 -
一个精度,我无法更改void addEventListener的java代码,只能在测试代码中调用它的方式。
-
@PeterK 我正在传递一个空参数来测试和验证是否引发了正确的 invalidParameterException。
!!是由 java 自动放入 kotlin 转换器 -
如果您不能更改界面,这很公平,但这不是我的意思。 Kotlin 将阻止您将 null 作为参数传递给非 null 字段。
-
是的,但是 java 和 kotlin 之间的主要区别之一是 kotlin 具有可空和不可空类型,并且当代码需要不可空类型时,您不能传递可空类型。它将强制您将值转换为不可为空的。最简单(也是最脏)的方法是使用
!!,如果值为空,它将抛出一个空指针。如果你需要测试这个特定的场景,也许你应该把这个类保留在 java 中。
标签: java kotlin nullpointerexception nullable non-nullable