You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin函数编译报错:调用抛异常函数为何仍需return?

Kotlin函数返回值与异常抛出的编译问题

问题重现

第一段代码编译失败:

fun alwaysThrow(): Nothing {
    throw Error("Always throws")
}

fun checkNumber(arg: Int): Int {
    if (arg > 10) {
        return arg
    } else {
        alwaysThrow() // 编译报错:A 'return' expression required in a function with a block body ('{...}')
    }
}

第二段代码编译正常:

fun checkNumber(arg: Int): Int {
    if (arg > 10) {
        return arg
    } else {
        throw Error("Sorry") // 编译通过
    }
}

原因分析

Kotlin编译器对这两种情况的处理逻辑有差异:

  • 直接写throw语句时,编译器能明确判定这个分支不会正常执行到函数末尾,因此不需要额外的return语句。
  • 调用返回Nothing类型的函数时,虽然运行时一定会抛出异常,但编译器不会自动将这个函数调用视为“终止执行”的信号。对于块体形式(用{...}包裹)的函数,编译器要求所有代码路径要么通过return返回值,要么直接抛出异常;单纯调用alwaysThrow()在编译期只是一个普通表达式,无法满足块体函数的返回路径检查。

解决方法

有两种方式可以让编译器识别alwaysThrow()的终止行为:

方法1:添加return语句

因为Nothing类型与任何类型兼容,直接返回alwaysThrow()的调用结果即可:

fun checkNumber(arg: Int): Int {
    if (arg > 10) {
        return arg
    } else {
        return alwaysThrow() // 编译通过
    }
}

方法2:改用表达式体函数

将函数从块体形式改为表达式体(用=定义),此时编译器会自动识别Nothing类型的调用会终止执行,无需额外return:

fun checkNumber(arg: Int): Int = 
    if (arg > 10) arg else alwaysThrow() // 编译通过

内容的提问来源于stack exchange,提问作者Alexis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:57:06