kotlin - 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 没有具有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!")
}
推荐阅读
- sql - 创建仅返回行数的存储过程
- c++ - c ++中的链接错误(多个cpp文件)
- python - 为什么我的逻辑回归只产生一个类?
- python - 消息:过时的元素引用:元素未附加到页面文档 - Web Table Python
- node.js - 想要在 iOS 中从 react-native-track-payer 播放远程 url
- javascript - 计算星期几是 JS 与 Sakamoto、Wang、Schwerdtfeger
- sql - 为什么使用 presto 选择不同的值符合 prestosql 的隐式转换
- javascript - 数据表固定表头
- java - 编译 Hadoop WordCount MapReduce 示例时出错
- javascript - 用输入类型=“时间”做数学