📜  Kotlin 异常处理 |尝试、捕捉、投掷,最后

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

Kotlin 异常处理 |尝试、捕捉、投掷,最后

异常是在程序执行期间(即在运行时)发生的不希望的或意外事件,它破坏了程序指令的正常流程。异常处理是一种技术,我们可以使用它来处理错误并防止可能导致程序停止的运行时崩溃。

两种类型的例外 -

  1. Checked Exception – 通常在方法上设置并在编译时检查的异常,例如 IOException、FileNotFoundException 等
  2. UnChecked Exception – 通常是由于逻辑错误并在运行时检查的异常,例如 NullPointerException、ArrayIndexOutOfBoundException 等

Kotlin 异常 –

在 Kotlin 中,我们只有未经检查的异常,并且只能在运行时捕获。所有异常类都是Throwable类的后代。

我们通常使用throw表达式来抛出异常对象——

throw Exception("Throw me")

一些常见的例外是:

  • NullPointerException:当我们尝试调用空对象的属性或方法时抛出它。
  • 算术异常:对数字执行无效算术运算时抛出。例如——除以零。
  • SecurityException:抛出它表示安全违规。
  • ArrayIndexOutOfBoundException:当我们尝试访问数组的无效索引值时抛出它。

Kotlin 抛出算术异常的程序——

Kotlin
fun main(args : Array){
    var num = 10 / 0      // throws exception
    println(num)
}


Kotlin
import kotlin.ArithmeticException
  
fun main(args : Array){
    try{
        var num = 10 / 0
    }
    catch(e: ArithmeticException){
        // caught and handles it
        println("Divide by zero not allowed")
    }
}


Kotlin
fun test(a: Int, b: Int) : Any {
    return try {
        a/b
        //println("The Result is: "+ a / b)
    }
    catch(e:Exception){
        println(e)
        "Divide by zero not allowed"
    }
}
// main function
fun main(args: Array) {
    // invoke test function
    var result1 = test(10,2  ) //execute try block
    println(result1)
    var result = test(10,0 )   // execute catch block
    println(result)
}


Kotlin
fun main(args : Array){
    try{
        var ar = arrayOf(1,2,3,4,5)
        var int = ar[6]
        println(int)
    }
  finally {
        println("This block always executes")
    }
}


Kotlin
fun main (args: Array){  
    try {  
        var int = 10 / 0  
        println(int)  
    } catch (e: ArithmeticException) {  
        println(e)  
    } finally {  
        println("This block always executes")  
    }  
}


Kotlin
fun main(args: Array) {
    test("abcd")
    println("executes after the validation")
}
fun test(password: String) {
    // calculate length of the entered password and compare
    if (password.length < 6)
        throw ArithmeticException("Password is too short")
    else
        println("Strong password")
}


输出:

Exception in thread "main" java.lang.ArithmeticException: / by zero

在上面的程序中,我们用值10/0初始化num变量,但我们知道在算术中除以零是不允许的。当我们试图运行程序时,它会抛出一个异常。

为了解决这个问题,我们必须使用 try-catch 块。

Kotlin try-catch 块 –

在 Kotlin 中,我们使用 try-catch 块在程序中进行异常处理。 try 块包含负责抛出异常的代码,而 catch 块用于处理异常。这个块必须写在 main 或其他方法中。 Try 块后面应该跟着 catch 块或 finally 块或两者。

try-catch 块的语法 -

try {
   // code that can throw exception
} catch(e: ExceptionName) {
   // catch the exception and handle it
}

使用 try-catch 块处理算术异常的 Kotlin 程序 -

科特林

import kotlin.ArithmeticException
  
fun main(args : Array){
    try{
        var num = 10 / 0
    }
    catch(e: ArithmeticException){
        // caught and handles it
        println("Divide by zero not allowed")
    }
}

输出:

Divide by zero not allowed

解释:
在上面的程序中,我们使用了 try-catch 块。可以抛出异常的num变量包含在 try 块的大括号中,因为在算术中没有定义除以零。异常被 catch 块捕获并执行println()语句。

Kotlin try-catch 块作为表达式 –

我们已经知道,表达式总是返回一个值。我们可以在程序中使用 kotlin try-catch 块作为表达式。表达式返回的值将是 try 块的最后一个表达式或 catch 块的最后一个表达式。如果代码中发生异常,则 catch 块返回该值。

使用 try-catch 作为表达式的 Kotlin 程序——

科特林

fun test(a: Int, b: Int) : Any {
    return try {
        a/b
        //println("The Result is: "+ a / b)
    }
    catch(e:Exception){
        println(e)
        "Divide by zero not allowed"
    }
}
// main function
fun main(args: Array) {
    // invoke test function
    var result1 = test(10,2  ) //execute try block
    println(result1)
    var result = test(10,0 )   // execute catch block
    println(result)
}

输出:

5
java.lang.ArithmeticException: / by zero
Divide by zero not allowed

在上面的代码中,我们使用了 try-catch 作为表达式。在程序顶部声明一个函数测试,并使用 try-catch 块返回一个值。我们已经从 main 方法调用了test函数并传递了参数值 (10,2) 测试函数评估参数并返回尝试值(10/2 = 5) 。但是在下一次调用中,我们传递了(b=0) ,这次异常被捕获并返回 catch 块的表达式。

Kotlin 终于阻止了——

在 Kotlin 中,无论 catch 块是否处理了异常,都会始终执行 finally 块。所以它用于执行重要的代码语句。
我们还可以将 finally 块与 try 块一起使用,并从那里跳过 catch 块。

finally 块与 try 块的语法 -

try {
   // code that can throw exception
} finally {
   // finally block code
}

使用 finally 块和 try 块的 Kotlin 程序 -

科特林

fun main(args : Array){
    try{
        var ar = arrayOf(1,2,3,4,5)
        var int = ar[6]
        println(int)
    }
  finally {
        println("This block always executes")
    }
}

输出:

在上面的程序中,我们使用了 try 和 finally 块并跳过了 catch 块。在这里,异常不是由 catch 块处理,而是执行 finally 块。

finally 块的语法与 try-catch 块 -

try {
   // code that can throw exception
} catch(e: ExceptionName) {
   // catch the exception and handle it.
} finally {
  // finally block code
}

我们也可以一起使用 try、catch 和 finally 块。
Kotlin 程序使用 finally 块和 try-catch 块-

科特林

fun main (args: Array){  
    try {  
        var int = 10 / 0  
        println(int)  
    } catch (e: ArithmeticException) {  
        println(e)  
    } finally {  
        println("This block always executes")  
    }  
}  

输出:

java.lang.ArithmeticException: / by zero
This block always executes

Kotlin throw 关键字 –

在 Kotlin 中,我们使用 throw 关键字来抛出显式异常。它也可以用来抛出自定义异常。

使用 throw 关键字的 Kotlin 程序 –

科特林

fun main(args: Array) {
    test("abcd")
    println("executes after the validation")
}
fun test(password: String) {
    // calculate length of the entered password and compare
    if (password.length < 6)
        throw ArithmeticException("Password is too short")
    else
        println("Strong password")
}

输出:

Exception in thread "main" java.lang.ArithmeticException: Password is too short