如何在 Kotlin 中使用 try – catch 作为表达式?
try 语句由一个 try 块组成,其中包含一个或多个语句。 { } 必须始终使用,即使对于单个语句也是如此。必须存在 catch-block、finally-block 或两者。这为我们提供了 try 语句的三种形式:
- 试着抓
- 试试……终于
- 尝试……抓住……终于
catch-block 包含的语句指定如果在 try-block 中抛出异常,该怎么做。如果 try 块中的任何语句(或从 try 块中调用的函数中)抛出异常,则控制立即转移到 catch 块。如果 try 块中没有抛出异常,则跳过 catch 块。您可以嵌套一个或多个 try 语句。如果内部 try 语句没有 catch 块,则使用封闭的 try 语句的 catch 块。 finally 块将始终在 try 块和 catch 块执行完毕后执行。它总是执行,无论是否抛出或捕获异常。
try – 作为表达式捕获
与Java中的异常相比,Kotlin 中的异常既相似又不同。在 Kotlin 中, throwable是所有异常的超类,每个异常都有堆栈跟踪、消息和可选原因。 try-catch 的结构也类似于Java中使用的结构。在 Kotlin 中,try-catch 语句如下所示:
Kotlin
try {
// some code to execute
catch (e: SomeException) {
// exception handle
}
finally {
// oprional finally block
}
Kotlin
fun main (args: Array) {
val str="23"
val a: Int? = try { str. toInt () } catch (e: NumberFormatException)
{-1}
println (a)
}
Kotlin
fun main (args: Array){
val str="abc"
val a: Int? = try { str. toInt () } catch (e: NumberFormatException)
{ -1 }
printin (a)
}
Kotlin
fun main (args: Array) {
val str="abc"
val a: Int = try {
str.toInt ()
} catch (e: NumberFormatException) {
-1
} finally {
-2
}
printIn (a)
}
Kotlin
fun fileToString(file: File) : String {
// readAllBytes throws TOException,
// but we can omit catching it
fileContent = Files.readAllBytes (file)
return String (fileContent)
}
至少有一个catch块是强制性的, finally块是可选的,因此可以省略。在 Kotlin 中, try-catch很特殊,因为它可以用作表达式。在本文中,我们将了解如何使用try-catch作为表达式。
例子
让我们编写一个简单的程序,将数字作为输入并将其值分配给变量。如果输入的值不是数字,我们会捕获NumberFormatException异常并将 -1 分配给该变量:
科特林
fun main (args: Array) {
val str="23"
val a: Int? = try { str. toInt () } catch (e: NumberFormatException)
{-1}
println (a)
}
输出:
23
现在,让我们尝试一些疯狂的事情并故意抛出异常:
科特林
fun main (args: Array){
val str="abc"
val a: Int? = try { str. toInt () } catch (e: NumberFormatException)
{ -1 }
printin (a)
}
输出:
-1
try-catch的使用将在极端情况下为您提供很多帮助,因为它们可以用作表达式。
解释
我们可以使用 try-catch 作为表达式的原因是 try 和 throw 都是 Kotlin 中的表达式,因此可以分配给变量。当您使用 try-catch 作为表达式时,将返回 try 或 catch 块的最后一行。这就是为什么在第一个示例中,我们得到 23 作为返回值,而在第二个示例中得到 -1。
在这里,需要注意的一点是,同样的事情不适用于 finally 块——也就是说,编写finally块不会影响结果:
科特林
fun main (args: Array) {
val str="abc"
val a: Int = try {
str.toInt ()
} catch (e: NumberFormatException) {
-1
} finally {
-2
}
printIn (a)
}
输出:
-1
如您所见,编写finally块不会改变任何内容。
在 Kotlin 中,所有的异常都是未经检查的,这意味着我们根本不需要应用 try-catch。这与Java完全不同,如果一个方法抛出异常,我们需要用try-catch包围它。以下是 Kotlin 中的 IO 操作示例:
科特林
fun fileToString(file: File) : String {
// readAllBytes throws TOException,
// but we can omit catching it
fileContent = Files.readAllBytes (file)
return String (fileContent)
}
正如你所看到的,如果我们不想的话,我们不需要用try-catch包装东西。在Java中,如果不处理此异常,我们将无法继续。