📜  如何在 Kotlin 中使用 try – catch 作为表达式?

📅  最后修改于: 2022-05-13 01:55:01.731000             🧑  作者: Mango

如何在 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中,如果不处理此异常,我们将无法继续。