Di que quiero hacer algo como
val foo = when(bar) { "one" -> true "two" -> false else -> // in Swift it would be `fatalError()` }¿Cómo lo hago?
Soy consciente de que generalmente hay mejores enfoques para este tipo de problema, pero también quiero saber cómo inducir fácilmente un bloqueo en Kotlin :)
Podrías lanzar una excepción. Esto aumentará la pila de llamadas hasta que alguien lo maneje o se quede sin marcos de pila y la aplicación se bloquee.
val foo = when(bar) { "one" -> true "two" -> false else -> throw IllegalArgumentException("$bar is Unknown") } Acabo de usar IllegalArgumentException aquí, pero es posible que desee definir el suyo propio.
Lanzar una excepción (o, mejor aún, un Error ) es una forma, pero es posible que no cierre el subproceso actual: cualquiera de las funciones de llamada podría detectar la excepción, o se podría haber establecido un UncaughtExceptionHandler para elSubproceso (o su ThreadGroup ).
Tampoco cerrará ningún otro subproceso que pueda estar ejecutándose. (Incluso si no ha iniciado ninguno usted mismo, son utilizados por rutinas, kits de herramientas de GUI y otros marcos de ejecución).
Para cerrar toda la aplicación, debe usar la función exitProcess() de Kotlin, o en Kotlin/JVM el método System.exit() equivalente. Eso terminará todos los hilos.
Pero incluso eso hará un apagado 'elegante', ejecutando cualquier gancho de apagado, finalizadores, etc. Si necesita cerrar por la fuerza una aplicación Kotlin/JVM inmediatamente , llame a Runtime.getRuntime().halt() .
(Y, por supuesto, probablemente sea una buena práctica mostrar primero algo en la salida estándar o el marco de registro que está utilizando, para indicar cuál era el problema).
Si observa la función global TODO() en Kotlin:
public inline fun TODO(): Nothing = throw NotImplementedError() Puede ver que es una función que devuelve Nothing (similar a Never de Swift), y throw un NotImplementedError .
Con esto, podemos crear nuestra propia función fatalError para imitar a Swift:
public fun fatalError(message: String = ""): Nothing = throw NotImplementedError(message) Y debido a que devuelve Nothing , puede usarlo de la misma manera que lo haría en Swift:
fun getValue(): Boolean = when(this) { "true" -> true "false" -> false else -> fatalError("Cannot determine value for $this") }