Обработка исключений в Kotlin — подробно с примерами

Исключение — это проблема времени выполнения, которая возникает в программе и приводит к завершению программы. Это может произойти из-за нехватки места в памяти, из-за связи массива, из-за условия, подобного делению на ноль. Для решения этого типа проблем во время выполнения программы используется метод обработки исключений.

Обработка исключений в Kotlin — это метод, который обрабатывает проблемы во время выполнения и поддерживает поток выполнения программы.

В Kotlin все классы исключений являются потомками класса Throwable. Чтобы добавить объект исключения, Kotlin использует выражение throw.

 
throw MyException("this throws an exception") 

В обработке исключений используются четыре разных ключевых слова:

  • try: блок try содержит набор операторов, которые могут генерировать исключение. За ним должен следовать либо catch, либо finally, либо оба.
  • catch: блок catch используется для перехвата исключения из блока try.
  • finally: блок finally всегда выполняется независимо от того, обработано ли исключение или нет. Поэтому он используется для выполнения важных операторов кода.
  • throw: ключевое слово throw используется для явного создания исключения.

Непроверенное исключение Kotlin

Непроверенное исключение — это исключение, которое возникает из-за ошибок в нашем коде. Этот тип исключения расширяет класс RuntimeException. Исключение Unchecked проверяется во время выполнения. Ниже приведены некоторые примеры непроверенного исключения:

  • ArithmeticException: возникает, когда мы делим число на ноль.
  • ArrayIndexOutOfBoundExceptions: генерируется при попытке доступа к массиву с неверным значением индекса.
  • SecurityException: вызывается менеджером безопасности, чтобы указать на нарушение безопасности.
  • NullPointerException: возникает при вызове метода или свойства нулевого объекта.

Проверенное исключение в Java

Проверяемое исключение проверяется во время компиляции. Этот тип исключения расширяет класс Throwable.

Ниже приведены некоторые примеры непроверенного исключения:

  • IOException.
  • SQLException и т. д.

Примечание. Kotlin не поддерживает проверенные исключения.

Блок try-catch в Kotlin

Блок try-catch в Котлин используется для обработки исключений в коде. Блок try содержит код, который может вызвать исключение, а блок catch используется для обработки исключения. Этот блок должен быть написан внутри метода. За блоком try Kotlin должен следовать либо блок catch, либо блок finally, либо и то, и другое.

Синтаксис try с блоком catch

try{ 
//code that may throw exception 
}catch(e: SomeException){ 
//code that handles exception 
} 
Syntax of try with finally block 
try {
    // some code
}
catch(e: SomeException) {
    // handler
}
finally {
    // optional finally block
}

Синтаксис try catch с блоком finally

try { 
// some code 
} 
catch (e: SomeException) { 
// handler 
} 
finally { 
// optional finally block 
} 

Проблема без обработки исключений

Давайте посмотрим на пример, который вызывает исключение, которое не обрабатывается.

fun main(args: Array<String>){
    val data = 20 / 0   //may throw exception
    println("code below exception ...")
}

Вышеприведенная программа генерирует исключение, из-за чего остальная часть кода не может быть выполнена.

Выход:

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at ExceptionHandlingKt.main(ExceptionHandling.kt:2)

Решение путем обработки исключений

Давайте посмотрим на решение вышеуказанной проблемы с помощью блока try-catch.

fun main(args: Array<String>){
    try {
        val data = 20 / 0  //may throw exception
    } catch(e: ArithmeticException) {
        println(e)
    }
    println("code below exception...")
}

Выход:

java.lang.ArithmeticException: / by zero
code below exception...

В приведенной выше программе после реализации блока try-catch выполняется остальная часть кода ниже исключения.

Блок try как выражение

Мы можем использовать блок try как выражение, которое возвращает значение. Значение, возвращаемое выражением try, является либо последним выражением блока try, либо последним выражением catch. Содержимое блока finally не влияет на результат выражения.

Пример Kotlin try выражения

Давайте рассмотрим пример блока try-catch как выражения, которое возвращает значение. В этом примере значение String равно Int, которое не генерирует никаких исключений и возвращает последний оператор блока try.

fun main(args: Array<String>){
val str = getNumber("10")
    println(str)
}
fun getNumber(str: String): Int{
    return try {
        Integer.parseInt(str)
    } catch(e: ArithmeticException) {
        0
    }
}

Выход:

10

Давайте изменим приведенный выше код, который генерирует исключение и возвращает последний оператор блока catch.

fun main(args: Array<String>){
val str = getNumber("10.5")
    println(str)
}
fun getNumber(str: String): Int{
    return try {
        Integer.parseInt(str)
    } catch(e: NumberFormatException) {
        0
    }
}

Выход:

0

Kotlin finally Block

Kotlin finally Block всегда выполняется независимо от того, обрабатывается ли исключение или нет. Поэтому он используется для выполнения важных операторов кода.

Kotlin finally Block — пример 1

Давайте посмотрим на пример обработки исключения, в котором исключение не возникает.

 
fun main(args: Array){ 
    try { 
        val data = 10 / 5 
        println(data) 
    } catch(e: NullPointerException) { 
        println(e) 
    } finally { 
        println("finally block always executes") 
    } 
    println("below codes...") 
} 

Выход:

2 
finally block always executes 
below codes... 

Пример 2

Давайте посмотрим на пример обработки исключения, в котором исключение возникает, но не обрабатывается.

 
fun main(args: Array){ 
    try { 
        val data = 5 / 0 
        println(data) 
    } catch(e: NullPointerException) { 
        println(e) 
    } finally { 
        println("finally block always executes") 
    } 
    println("below codes...") 
} 

Выход:

finally block always executes 
Exception in thread "main" java.lang.ArithmeticException: / by zero 

Пример 3

Давайте посмотрим на пример обработки исключения, в котором возникает и обрабатывается исключение.

 
fun main(args: Array){ 
    try { 
        val data = 5 / 0 
        println(data) 
    } catch(e: ArithmeticException) { 
        println(e) 
    } finally { 
        println("finally block always executes") 
    } 
    println("below codes...") 
} 

Выход:

java.lang.ArithmeticException: / by zero 
finally block always executes 
below codes... 

Примечание. Блок finally не будет выполнен, если программа завершится (вызовом exitProcess(Int) или любой ошибкой, которая приведет к прерыванию процесса).

Оцените статью