Освой Kotlin играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Исключения: try/catch/finally/throw

Обработка исключений устроена так же, как в 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() {}
Реклама