关于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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理