在Kotlin中,异常处理是通过try/catch/finally结构实现的,但与Java的方法不同,它专注于unchecked异常和简洁的语法。一个重要的区别是Kotlin没有checked exceptions,这减轻了程序员必须声明throws和捕获这些异常的负担。
Java使用checked/unchecked exceptions,其中checked需要显式捕获或声明。这通常导致冗余的样板代码和不方便的代码。Kotlin的设计更简单——所有异常通常都是unchecked(继承自RuntimeException),简化了处理,并使代码更具可读性。
在Kotlin中,Java开发人员试图捕获和声明checked exceptions——代码可以编译,但意义丧失。此外,不理解细节而使用finally会导致泄漏或无效代码。
在Kotlin中简洁有效地使用try/catch/finally:
fun process(data: String): Int = try { data.toInt() } catch (e: NumberFormatException) { 0 } finally { println("Processing done") }
关键特性:
如果在finally块中抛出异常,会发生什么?这如何影响返回值?
从finally中抛出的异常始终会覆盖try/catch块中的任何其他异常或返回,可能导致重要的崩溃原因数据丢失。
fun demo(): Int = try { 1 } finally { throw RuntimeException("error in finally") }
在Kotlin中,try/catch可以是表达式吗?与Java的区别是什么?
可以。Kotlin中的try/catch/finally是表达式,因此可以返回结果并在允许值的地方使用。
val value = try { risky() } catch (e: Exception) { fallback() }
在Java中这只是语句。
在Kotlin中,如果调用了带throws的外部Java函数,必须捕获异常吗?
不必。因为Kotlin编译器会忽略checked exceptions:可以不显式捕获,但它们仍然可能在运行时被抛出。
到处插入catch (e: Exception),不区分实际和预期的错误。使用finally返回值,这导致错误时出现意外行为。
优点:
缺点:
仅捕获预期的错误,仅将finally用于清理资源,并在需要提高可读性时将try/catch用作表达式。
优点:
缺点: