乐趣区

关于android:Kotlin实战五Kotlin中的异常

一、kotlin 如何抛异样

Kotlin 中的异样解决与 Java 或者其余语言中的解决形式类似。一个函数能够以失常形式完结, 或者当谬误产生的时候抛出异样。函数调用者捕捉这个异样并解决它;如果没有,异样从新在调用栈向上抛。

Kotlin 中的异样解决语句的根本模式和 Java 是类似的:java 中:

if(0 <= percentage <= 100){throw new IllegalArgumentException( "A percentage value must be between 0 and 100: $percentage") ;
}

kotlin 中:(和 java 的区别,不用应用 new 来创立实例)

if (percentage !in 0..100) {throw IllegalArgumentException( "A percentage value must be between 0 and 100: $percentage")
}

不光如此,kotlin 中的 throw 构造是一个表达式,能作为另一个表达式的一部分应用:

val percentage =
    if (number in 0..100)
        number
    else
        throw IllegalArgumentException( //“throw”是一个表达式
            "A percentage value must be between 0 and 100: $number")

这个例子中,如果满足条件,程序的行为正确,percentage 会 number 初始化,否则异样将被抛出,而变量也不会初始化。

二、“try”、“catch”、“finally”

就像 Java 之中,能够用 try 构造,和 catch 和 finally 子句解决异样。

如下,读取指定文件的一行,尝试解析为数字,而后返回一个数字,如果这行不是无效的数字,返回 null。

fun readNumber(reader: BufferedReader): Int? { // 不用显式地指定这个函数可能抛出的异样
    try {val line = reader.readLine()
        return Integer.parseInt(line)
    } catch (e: NumberFormatException) { // 异样的类型在左边
        return null
    } finally { //finally 就像在 Java 一样的
        reader.close()}
}
val reader = BufferedReader(StringReader("239"))
println(readNumber(reader))
//239

java 中:

public int readNumber(BufferedReader reader) throws IOException{ // 显式地指定这个函数可能抛出的异样
  try {String line = reader.readLine()
      return Integer.parseInt(line)
  } catch (NumberFormatException e) {return null} finally {reader.close()
  }
}

从比照中咱们能够看出 kotlin 和 Java 最大的不同是不须要 throws 子句。在 java 中,这种异样必须显示的解决,必须申明你的函数可能抛出的所有受检异样。如果调用另一个函数,须要解决这个函数的受检异样,或者申明你的函数可能抛出的这些异样。

和其余古代 JVM 语言,Koltin 不区别受检查和不受查看的异样。你须要指定一个函数抛出的异样,你能够也能够不解决这些异样。这个设计决定是基于 Java 中应用受查看异样的实际。教训表明,Java 规定经常须要很多无意义的代码从新抛出或者疏忽异样,而且这些规定不能总是爱护你免受坑你产生的谬误。

在下面的例子中,NumberFormatException 是一个不受查看的异样。所以 Java 编译器不会强制你捕捉这个异样,你能够很容易的看见运行时的异样。这相当令人遗憾,因为不无效的输出数据是常常的事件,应该更优雅的解决。同时,BufferedReader.close 办法也能抛出一个 IOException 异样,这是个须要解决的受查看的异样。如果敞开一个流失败了,大部分代码不能采取任何有意义的口头,所以须要从 close 办法捕捉异样的代码根本是样板代码。

三、try 作为一个表达式

为了显示 Java 和 Kotlin 间接一个重要区别,让咱们略微扭转下这个例子。移除 fianlly 局部 (因为你曾经晓得这个怎么工作),而后加一些代码打印从这个文件读取的数字。

fun readNumber(reader: BufferedReader) {
    val number = try {Integer.parseInt(reader.readLine()) // 成为 try 表达式的值
    } catch (e: NumberFormatException) {return}
    println(number)
}

val reader = BufferedReader(StringReader("not a number"))
readNumber(reader)// 没有打印任何数字 

Kotlin 中 try 关键词,就像 if 和 when,引进了一个表达式,你能够把它的值赋值给一个变量。不像 if,你始终须要把语句保函在花括号中。就像其余语句,如果包涵多个表达式,try 表达式的值是最初一个表达式的值。在这个例子中,在 catch 代码块中有 return 语句,所以这个函数在 catch 代码块后不会再进行。如果你想持续这个执行,catch 语句也须要一个值,这个值是最初表达式的值:

fun readNumber(reader: BufferedReader) {
    val number = try {Integer.parseInt(reader.readLine()) // 没有异样产生时应用这个值
    } catch (e: NumberFormatException) {null // 异样产生时应用 null 值}
    println(number)
}
val reader = BufferedReader(StringReader("not a number"))
readNumber(reader)// 异样被抛出,所以函数打印 null
//null

如果一个 try 代码块执行一切正常,代码块中最初一个表达式就是后果。如果捕捉到一个异样,那么 cache 代码块中最初一个表达式就是后果。

四、总结

  • 1、kotlin 中的异样解决和 java 解决类似,除了 Kotlin 不要求你申明函数能够抛出的异样。
  • 2、如果一个 try 代码块执行一切正常,代码块中最初一个表达式就是后果。
  • 3、如果捕捉到一个异样,那么 cache 代码块中最初一个表达式就是后果。

本文转自 https://cloud.tencent.com/developer/article/1397852,如有侵权,请分割删除。

相干视频:

Android 进阶学习:Kotlin 核心技术_哔哩哔哩_bilibili
Android 网络架构搭建与原理解析(一)——通过一个网络申请一步一步见证网络模块的成长_哔哩哔哩_bilibili
【Android 进阶课程】——colin Compose 的绘制原理解说(一)_哔哩哔哩_bilibili
【Android 进阶教程】——Framework 面试必问的 Handler 源码解析_哔哩哔哩_bilibili
【Android 进阶教程】——热修复原理解析_哔哩哔哩_bilibili
【Android 进阶教程】——如何解决 OOM 问题与 LeakCanary 原理解析_哔哩哔哩_bilibili

退出移动版