首页 > 解决方案 > Kotlin 赋值不是表达式。还有其他强制启用断言的方法吗?

问题描述

我目前正在学习 Kotlin,其中一种方法是自动将 Java 代码转换为 Kotlin 并研究结果。我尝试转换的一段 Java 代码是一个类中的以下静态块,它试图确保启用断言:

static {
    boolean assertsEnabled = false;
    assert assertsEnabled = true;
    if (!assertsEnabled)
        throw new AssertionError("Please enable assertions!");
}

这依赖于assertsEnabled = true表达式作为assert. 在 Java 中,赋值是表达式。在 Kotlin 中,它们不是,因此无法转换。还有其他方法吗?

标签: kotlin

解决方案


不幸的是,Kotlin 没有具有assert特殊语义的关键字。相反,它具有以下功能:

inline fun assert(value: Boolean, lazyMessage: () -> Any)

您可以看到作为第一个参数传递的表达式是无条件评估的。这意味着您无法实现与 Java 相同的轻量级检查;您必须触发实际的断言失败才能确定。

因此,您需要按照以下建议进行检查@Zoe

try {
    assert(false)
    throw IllegalStateException("Please enable assertions!")
} catch (e: AssertionError) {
    // Things are looking good; carry on
}

如果你坚持抛出一个AssertionError而不是IllegalStateException,你可以使用一个布尔变量。

var assertionsAreDisabled = false
try {
    assert(false)
    assertionsAreDisabled = true
} catch (e: AssertionError) {
    // Things are looking good; carry on
}
if (assertionsAreDisabled) {
    throw AssertionError("Please enable assertions!")
}

推荐阅读