На этом шаге мы рассмотрим случаи возникновения исключений.
Как и многие другие языки, 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.
На следующем шаге мы рассмотрим возбуждение исключений.