Kotlin异常处理
在本教程中,我们将讨论Kotlin中的异常处理。
什么是例外?
异常可能会破坏您的程序。
这使得异常处理成为任何编程语言的重要组成部分。
使用异常处理,您可以处理错误并防止可能导致程序停止的运行时崩溃。
相反,使用异常处理可以优雅地处理失败的条件,并继续执行程序流程。
Java中的检查异常与未检查异常通常,检查异常是在方法上设置的,并在编译时进行检查。
相反,未检查的异常派生自RuntimeExceptions并在运行时进行检查。
Kotlin例外
所有异常均来自Throwable类。
要抛出异常,我们使用throw
关键字。
throw Exception("Oops. Something went wrong")
在Kotlin中,没有检查过的异常。
这意味着没有throws关键字。
try-catch-finally
为了处理异常,我们使用try-catch
块。
在try块中设置了可能给出异常的代码段。
异常捕获在catch块内。
无论发生什么情况,finally块始终运行。
finally块是可选的。
通常用于释放try-catch中使用的所有资源。
通常,一次尝试可以有多个收获。
只运行第一个匹配的捕获。
因此,建议按以下顺序堆叠捕获:特定异常到常规异常。
fun main(args: Array<String>) { try { var a = 0 var x = 7/a val v = "theitroad.local" v.toInt() } catch (e: ArithmeticException) { println("Arthimetic Exception") } catch (e: Exception) { println("Exception occured. To print stacktrace use e") } finally { println("Finally. It's over") } } //Prints //Arthimetic Exceptions
一旦在" try"块中发现异常,它就不会在该try块中执行其他任何操作。
我们甚至可以将" try"与" finally"一起使用。
try{ throw Exception("Hi. how are you?") }finally { println("Finally. Good.") }
尝试一下,必须至少有一个陷阱或者最后一个障碍物。throw
是一个表达式,也可以打印堆栈跟踪。
try是一种表达式
可以在try-catch块中执行的值可以返回并存储在变量中。
fun main(args: Array<String>) { var x= "Androidly.net" var a = try { x.toInt() } catch (e: NumberFormatException) { "This is a string" } println(a) x = "5" a = try { x.toInt() } catch (e: NumberFormatException) { "This is a string" } println(a) }
在上面的代码中,我们可以为变量a设置两种不同类型的值。
如果try语句未执行,则设置catch的值。
无论设置了哪个,都不会将" finally"语句设置为表达式。
fail函数
这是捕获异常的快捷方式,如下所示。
import kotlin.test.fail class User { var name: String? = "" } fun main(args: Array<String>) { var user = User() user.name = null val n: String = user.name ?: fail("No name found") print(5) }
如果执行了fail语句,则程序在打印后将无法运行。
隐式地,fail语句包含throw关键字。
fail函数如下所示:
fun fail(message: String): Nothing { throw IllegalArgumentException(message) }
没有什么是抛出回报的特殊回报类型。
在上面的示例中,fail函数还会打印我们并不总是想要的堆栈跟踪。
我们可以覆盖fail函数以仅打印消息。
class User { var name: String? = "" } fun main(args: Array<String>) { var user = User() user.name = null val n: String = user.name ?: fail("No name found") println(n) print(10) } fun fail(message: String): Nothing { val throwable = Throwable(message) Thread.setDefaultUncaughtExceptionHandler { t, e -> System.err.println(e.message) } throw throwable } //Prints No name found
将内联函数与异常处理一起使用
我们在这里讨论了Kotlin中的内联函数。
为什么要使用内联函数?它们不会造成开销。
现在,我们已经看到try-catch块会变得凌乱和冗长。
让我们使用内联函数使其简洁明了,因为这正是Kotlin代码的优势所在。
fun main(args: Array<String>) { simpleTryCatch { var x = 0 var y = 7 var z = y/x } simpleTryCatch { var x = "Androidly" var number = x.toInt() } } inline fun simpleTryCatch(action: () -> Unit) { try { action() } catch (t: Throwable) { println("Caught something. ${t.message}") } }