总是抛出异常的函数 - 具有块体的函数中需要一个“返回”表达式

Ale*_*xis 5 kotlin kotlin-nothing

为什么下面的代码是错误的?

fun alwaysThrow() {
    throw Error("Sorry")
}

fun checkNumber(arg: Int): Int {
    if (arg > 10) {
        return arg
    } 
    alwaysThrow()
}

fun main() {
    try {
        checkNumber(20)
    } catch (e: Error) {
        println("Error caught: ${e.message}")
    }
}
Run Code Online (Sandbox Code Playgroud)

该函数checkNumber无法编译并出现错误:

具有块体的函数中需要“返回”表达式(“{...}”)

我不明白为什么,因为过去的任何事情都不会被执行alwaysThrow

有没有办法告诉编译器?

由于某种原因,这段代码确实可以编译:

fun checkNumber(arg: Int): Int{
    if (arg > 10) {
        return arg
    } 
    throw Error("Sorry")
}

fun main() {
    try {
        checkNumber(1)
    } catch (e: Error) {
        println("Error caught: ${e.message}")
    }
}
Run Code Online (Sandbox Code Playgroud)

Vad*_*dik 7

您可以将这一信息告知 Kotlin 编译器。这就是为什么你需要Nothing输入:

fun alwaysThrow(): Nothing {
    throw Error("Sorry")
}
Run Code Online (Sandbox Code Playgroud)

没有什么是没有实例的。您可以使用 Nothing 来表示“一个从不存在的值”:例如,如果一个函数的返回类型为 Nothing,则意味着它从不返回(总是抛出异常)。