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
相关产品推荐
相关产品推荐

