Шаг 71.
Основы Kotlin.
Null-безопасность и исключения. Исключения (общие сведения)

    На этом шаге мы рассмотрим случаи возникновения исключений.

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

    Рассмотрим примеры. Начнем с создания нового файла в NyetHack с именем SwordJuggler.kt и добавим в него функцию main().

    Вопреки здравому смыслу группа завсегдатаев таверны убедила вас жонглировать мечами. Количество мечей, которыми вы жонглируете, будет храниться в переменной целочисленного типа с поддержкой значения null. Почему? Если swordsJuggling равно null, значит, ваши навыки жонглирования настолько низки, что ваше путешествие в мире NyetHack может быстро закончиться.

    Начните с добавления переменных для хранения количества мечей, которым вы можете жонглировать, и оценки вашей сноровки. Оценку сноровки можно получить с помощью того же механизма случайных чисел, что использовался в 54 шаге. Если вы умелый жонглер, выведите количество мечей в консоль.

fun main() {
    var swordsJuggling: Int? = null
    val isJugglingProficient = (1..3).shuffled().last() == 3
    if (isJugglingProficient) { swordsJuggling = 2 }
    println("You juggle $swordsJuggling swords!")
}
Файл с проектом можно взять здесь.


Рис.1. Добавление логики жонглирования мечами (SwordJuggler.kt)

    Запустите SwordJuggler. В одном случае из трех вы получите высшую оценку своей сноровки; это неплохо для новичка. Если проверка на сноровку пройдет успешно, вы увидите сообщение:

  You juggle 2 swords!
Иначе появится сообщение:
  You juggle null swords!

    Вывод значения swordJuggling, по своей сути, не является опасной операцией. Программа выведет слово null в консоль и продолжит работу. Поднимем уровень угрозы. Добавьте еще один меч с помощью функции plus() и оператора !!..

fun main() {
    var swordsJuggling: Int? = null
    val isJugglingProficient = (1..3).shuffled().last() == 3
    if (isJugglingProficient) { swordsJuggling = 2 }
    swordsJuggling = swordsJuggling!!.plus(1)
    println("You juggle $swordsJuggling swords!")
}
Файл с проектом можно взять здесь.


Рис.2. Добавим третий меч (SwordJuggler.kt)

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

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

    Испытайте удачу, запустив SwordJuggler пару раз. Если приложение дает сбой, вы увидите KotlinNullPointerException, и оставшаяся часть кода (оператор println) не будет выполнена (рисунок 3).


Рис.3. Сбой при выполнении программы

    Если есть вероятность, что переменная получит значение null, есть и вероятность появления KotlinNullPointerException. Это одна из причин того, почему Kotlin по умолчанию выбирает для переменных типы без поддержки null.

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




Предыдущий шаг Содержание Следующий шаг