Kotlin в IntelliJ IDEA Kotlin змінні Kotlin типи даних Kotlin операції з числами Kotlin умовні вирази Kotlin умовні конструкції Kotlin цикли Kotlin послідовності Kotlin масиви Kotlin функціональне програмування Kotlin змінна кількість параметрів. Vararg Kotlin повернення результату. оператор return Kotlin однорядкові і локальні функції Kotlin перевантаження функцій Kotlin Лямбда-вирази Kotlin функції вищого порядку Kotlin Анонімні функції Kotlin ООП Класи і об'єкти Kotlin ООП властивості Kotlin ООП конструктор Kotlin ООП функції в класах Kotlin ООП Пакети та імпорт Kotlin ООП модифікатори видимості Kotlin ООП вкладені класи Kotlin ООП інтерфейси Kotlin ООП спадкування Kotlin ООП Перевизначення методів і властивостей Kotlin ООП Абстрактні класи та методи Kotlin ООП Data-класи Kotlin ООП перерахування enums Kotlin ООП Null і nullable-типи Kotlin ООП Обробка винятків Kotlin ООП перетворення типів Kotlin ООП Інфіксна функція Kotlin ООП функції розширення Kotlin ООП Узагальнені класи і функції Kotlin ООП обмеження узагальнень Kotlin ООП Варіантність, коваріантність і контраваріантність Kotlin Колекції. Змінювані і незмінні колекції Kotlin Колекції. LIST список Kotlin Колекції. Set Kotlin Колекції. Map

Kotlin ООП Обробка винятків


Виняток становить подія, яке виникає при виконанні програми і порушує її нормальної хід. Наприклад, при передачі файлу по мережі може обірватися з'єднання з мережею, і в результаті чого може бути згенеровано виняток. Якщо виняток оброблено, то програма падає і припиняє свою роботу. Тому при виникненні виключень їх слід обробляти.

Для обробки виключень застосовується конструкція try..catch..finally . У блок try поміщаються ті дії, які потенційно можуть викликати виключення (наприклад, передача файлу по мережі, відкриття файлу і т.д.). Блок catch перехоплює виникло виключення і обробляє його. Блок finally виконує деякі завершальні дії.

try {
    // код, генерирующий исключение
}
catch (e: Exception) {
    // обработка исключения
}
finally {
    // постобработка
}

Після оператора catch в дужках міститься параметр, який представляє тип винятку. З цього параметра можна отримати інформацію про те, що сталося виключення.

Блок finally є необов'язковим, його можна опустити. Блок catch також може бути відсутнім, однак обов'язково повинен бути блок try і як мінімум один з блоків: або catch, або finally. Також конструкція може містити кілька блоків catch для обробки кожного типу виключення, яке може виникнути.

Блок catch виконується, якщо тільки виникло виключення. Блок finally виконується в будь-якому випадку, навіть якщо немає виключення.

Наприклад, при розподілі на нуль Kotlin генерує виняток:

fun main(args: Array<String>) {
 
   try{
       val x : Int = 0
       val z : Int = 0 / x
       println("z = $z")
   }
   catch(e: Exception){
       println("Exception")
       println(e.message)
   }
}

Дія, яке може викликати виключення, тобто операція ділення, поміщається в блок try. У блоці catch перехоплюємо виняток. При цьому кожен виняток має певний тип. В даному випадку використовується загальний тип винятків - клас Exception . Через властивість message цього класу ми можемо отримати власне повідомлення про виключення. Так, в даному випадку при виконанні програми ми отримаємо наступний консольний висновок:

try{
    val x : Int = 0
    val z : Int = 0 / x
    println("z = $z")
}
catch(e: Exception){
    println("Exception")
    println(e.message)
}
finally{
    println("Program has been finished")
}

В цьому випадку консольний висновок буде виглядати наступним чином:

try {
    val nums = arrayOf(1, 2, 3, 4)
    println(nums[6])
}
catch(e:ArrayIndexOutOfBoundsException){
    println("Out of bound of array")
}
catch (e: Exception){
    println(e.message)
}

В даному випадку при доступі за недійсним індексу в масиві буде генеруватися виняток типу ArrayIndexOutOfBoundsException. За допомогою блоку catch(e:ArrayIndexOutOfBoundsException) . Якщо в програмі будуть інші винятки, які не уявляють тип ArrayIndexOutOfBoundsException, то вони будуть оброблятися другим блоком catch, так як Exception - це загальний тип, який підходить під всі типи винятків. При цьому варто відзначити, що на початку обробляється виключення більш приватного типу - ArrayIndexOutOfBoundsException, і тільки потім - більш загального типу Exception.


оператор throw

Можливо, в якихось ситуаціях ми вручну захочемо генерувати виняток. Наприклад, при обчисленні факторіала ми можемо викидати виняток, якщо передане число, для якого потрібно знайти факторіал, менше 1. Для генерації виключення застосовується оператор throw , після якого вказується об'єкт виключення:

fun main(args: Array<String>) {
 
   try{
       println(factorial(-5))
   }
   catch(e: Exception){
       println(e.message)
   }
}
 
fun factorial(n: Int): Int{
    if(n < 1) throw  Exception("Input number must be more than zero")
    var result = 1
    for(i in 1..n)
        result *= i
    return result
}

Після оператора throw вказано об'єкт виключення. Для визначення об'єкта Exception застосовується конструктор, який приймає як параметр повідомлення про виключення. В даному випадку це повідомлення про те, що число повинне бути більше нуля.

І якщо при виконанні функції factorial в неї буде передано число менше 1, то буде згенеровано виняток.


повернення значення

Конструкція може повертати значення. наприклад:

fun main(args: Array<String>) {
 
    val a: Int? = try { factorial(5) } catch (e: Exception) { null }
 
   println(a)
}
 
fun factorial(n: Int): Int{
    if(n < 1) throw  Exception("Input number must be more than zero")
    var result = 1
    for(i in 1..n)
        result *= i
    return result
}

В даному випадку змінна a отримує в якості значення факторіал числа, переданого в функцію factorial. Якщо ж станеться виключення, тоді змінна a отримує те значення, яке зазначено в блоці catch, тобто в даному випадку значення null.


Наш партнер:
beta test mp3 playlist downloader