Освой Kotlin играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Обработка исключений устроена так же, как в Java. Функция может завершиться обычным способом или возбудить исключение в случае ошибки. При вызове функции можно перехватить исключение и обработать его. Можно пропустить обработку, тогда исключение продолжит своё движение вверх по стеку.
var percentage = 501
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
if(percentage !in 0..100){
throw IllegalArgumentException("Значение должно быть в пределах от 0 до 100: " +
"$percentage")
}
}
}
Ключевое слов throw можно использовать как выражение в составе других выражений.
var number = 101
var percent = ""
val percentage =
if (number in 0..100) {
percent = "$number%"
} else
throw IllegalArgumentException(
"Значение должно быть в пределах от 0 до 100: " + "$number")
println(percent)
Можно использовать выражение с try/catch/finally. Напишем функцию чтения строки из файла и преобразования её в строку. В успешном случае возвращается число или null, если строка не является числом.
fun readNumber(reader: BufferedReader): Int?{
try{
val line = reader.readLine()
return Integer.parseInt(line)
}
catch(e: NumberFormatException){
return null
}
finally{
reader.close()
}
}
Ключевое слово try можно использовать как выражение. Изменим функцию и добавим код, выводящий число, прочитанное из файла.
fun readNumber(reader: BufferedReader) {
val number = try {
Integer.parseInt(reader.readLine())
} catch (e: NumberFormatException) {
return
}
println(number)
}
button.setOnClickListener {
val reader = BufferedReader(StringReader("не число"))
readNumber(reader) // ничего не выведет
}
В блоке catch находится оператор return, поэтому выполнение функции прервётся после выполнения блока catch. Если нужно, чтобы функция продолжила выполнение после выхода из блока catch, нужно вернуть значение последнего выражения.
fun readNumber(reader: BufferedReader) {
val number = try {
Integer.parseInt(reader.readLine())
} catch (e: NumberFormatException) {
null
}
println(number)
}
В этом случае возникнет исключение и возвратится null. Если бы строка содержала число, то выражение в try станет результатом.
Можно создавать собственные типы исключений, используя суперкласс Exception.
class CatException: Exception() {}
Функция printStackTrace() доступна для всех исключений, выполняемых в JVM. Если вы не можете восстановить работу программы после исключения, функция printStackTrace() поможет выявить причину проблемы.
try {
//Выполнить рискованную операцию
} catch (e: Exception) {
e.printStackTrace()
//Код, который выполняется при возникновении исключения
}