Kotlin throw关键字

Kotlin throw关键字,在try…catch和finally中,由于调用的是自己写的divide()方法,因此很清楚该方法可能会发生异常。试想一下,如果去调用一个别人写的方法时,是否能知道别人写的方法是否会有异常呢?这是很难做出判断的。针对这种情况,在Kotlin中,允许在可能发生异常的代码中通过throw关键字对外声明该段代码可能会发生异常,这样在使用这段代码时,就明确地知道该段代码有异常,并且必须对异常进行处理。

throw关键字抛出异常的语法格式如下:

throw ExceptionType("异常信息")

上述语法格式是通过throw表达式来抛出一个异常,这个表达式需要放在容易出现异常的代码中,也可以作为Elvis表达式(三元表达式)的一部分,throw后面需要声明发生异常的类型,通常将这种做法称为抛出一个异常。接下来我们来修改try…catch和finally中的代码,在调用divide()方法的代码上方抛出一个异常,修改后的代码如下所示。

package com.itheima.chapter04
fun divide(a: Int, b: Int): Int {
    if (b==0)throw ArithmeticException(" 发生异常")
    var result: Int = a / b
    return result
}
fun main(args: Array<String>) {
    var result: Int = divide(5, 0)  // 调用divide() 方法
    println(result)
}

运行结果:

Exception in thread"main"java.lang.ArithmeticException:发生异常
at com.itheima.chapter04.ExceptionKt.divide(Exception.kt:3)
at com.itheima.chapter04.ExceptionKt.main(Exception.kt:8)

上述代码中,第8行代码调用divide()方法时传递的第2个参数是0,程序在运行时不会发生被0除的异常,由于在divide()方法中抛出了一个算术异常ArithmeticException,因此在调用divide()方法时就必须对抛出的异常进行处理,否则就会发生编译错误。接下来我们对上面代码进行修改,在调用divide()方法时对其进行try…catch处理,修改后的代码如下所示。

package com.itheima.chapter04
fun divide (a: Int, b: Int): Int {
    if (b == 0) throw ArithmeticException(" 发生异常")
    var result: Int = a / b
    return result
}
fun main(args: Array<String>) {
    try {
        var result: Int = divide (5, 0)  //调用divide() 方法
       println(result)
   } catch (e: ArithmeticException) {
       println(e.message)
   }
}

运行结果:

发生异常

上述代码中,在main()函数中通过try…catch语句已经捕获了divide()方法中抛出的异常,由于该程序的divide()方法中传递的变量b的值为0,因此运行结果为发生异常。如果将变量b的值设置为1,则运行结果为5。

Nothing类型

在Kotlin中,有些函数的“返回值类型”的概念没有任何意义,此时Kotlin使用一种特殊的返回值类型Nothing来表示,Nothing是一个空类型(uninhabited type),也就是说在程序运行时不会出任何一个Nothing类型的对象。在程序中,可以使用Nothing类型来标记一个永远不会有返回数据的函数,具体示例代码如下:

fun fail(message: String): Nothing { 
    throw IllegalArgumentException(message) 
}

当调用含有Nothing类型的函数时,可能会遇到这个类型的一种情况就是类型推断,这个类型的可空类型为Nothing?,该类型有一个可能的值是null,如果用null来初始化一个变量的值,并且又不能确定该变量的具体类型时,编译器会推断这个变量的类型为Nothing?类型,具体示例代码如下:

val x = null             // 变量“x”的类型为“Nothing? ” 
val l = listOf(null)     // 变量“l”的类型为“List<Nothing?>”

上述代码中,变量x的初始值为null,并且该变量的具体类型不确定,因此编译器会推断该变量的类型为“Nothing?”。变量l的初始值为listOf(null),可以看到List集合的初始值为null,此时不能确定该集合的具体类型,因此编译器会推断该集合的类型为“List<Nothing?>”

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!