相当于Kotlin中Swift的fatalError()

时间:2019-02-27 14:08:50

标签: swift kotlin

说我想做某事

val foo = when(bar) {
   "one" -> true
   "two" -> false
   else -> // in Swift it would be `fatalError()`
}

我该怎么做?

我知道通常可以使用更好的方法来解决此类问题,但是我想知道如何轻松导致Kotlin崩溃:)

3 个答案:

答案 0 :(得分:1)

您可以抛出异常。这将使调用堆栈冒泡,直到有人处理它或您耗尽堆栈帧并且应用程序崩溃为止。

val foo = when(bar) {
   "one" -> true
   "two" -> false
   else -> throw IllegalArgumentException("$bar is Unknown")
}

我在这里只是使用IllegalArgumentException,但您可能想定义自己的

答案 1 :(得分:1)

抛出异常(或者更好的是,Error)是一种方法,但是它可能无法关闭当前线程:任何调用函数都可以捕获异常,或者抛出UncaughtExceptionHandler可能已经为Thread(或其ThreadGroup)设置了。

也不会关闭可能正在运行的任何其他线程。 (即使您自己还没有开始,协程,GUI工具箱和其他执行框架都将使用它们。)

要关闭整个应用程序,应使用Kotlin exitProcess()函数,或在Kotlin / JVM中使用等效的System.exit()方法。那将终止所有线程。

但是,即使那样,它也会执行“正常”关闭,并运行所有关闭钩子,终结器和&c。如果您需要立即强行杀死Kotlin / JVM应用,请致电Runtime.getRuntime().halt()

(当然,首先显示要输出到stdout或您正在使用的日志记录框架以指示问题所在的方法可能是个好习惯。)

答案 2 :(得分:1)

如果您在Kotlin中查看TODO()全局函数:

public inline fun TODO(): Nothing = throw NotImplementedError()

您会看到它是一个返回Nothing的函数(类似于Swift的Never),并且它throw是一个NotImplementedError

以此,我们可以创建自己的fatalError函数来模仿Swift:

public fun fatalError(message: String = ""): Nothing = throw NotImplementedError(message)

由于它返回Nothing,因此您可以像在Swift中一样使用它:

fun getValue(): Boolean = when(this) {
  "true" -> true
  "false" -> false
  else -> fatalError("Cannot determine value for $this")
}