Try catch kotlin примеры

Обработка исключений в Kotlin – подробно с примерами

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

Обработка исключений в Kotlin — это метод, который обрабатывает проблемы во время выполнения и поддерживает поток выполнения программы.

В Kotlin все классы исключений являются потомками класса Throwable. Чтобы добавить объект исключения, Kotlin использует выражение throw.

throw MyException("this throws an exception")

В обработке исключений используются четыре разных ключевых слова:

  • try: блок try содержит набор операторов, которые могут генерировать исключение. За ним должен следовать либо catch, либо finally, либо оба.
  • catch: блок catch используется для перехвата исключения из блока try.
  • finally: блок finally всегда выполняется независимо от того, обработано ли исключение или нет. Поэтому он используется для выполнения важных операторов кода.
  • throw: ключевое слово throw используется для явного создания исключения.

Непроверенное исключение Kotlin

Непроверенное исключение — это исключение, которое возникает из-за ошибок в нашем коде. Этот тип исключения расширяет класс RuntimeException. Исключение Unchecked проверяется во время выполнения. Ниже приведены некоторые примеры непроверенного исключения:

  • ArithmeticException: возникает, когда мы делим число на ноль.
  • ArrayIndexOutOfBoundExceptions: генерируется при попытке доступа к массиву с неверным значением индекса.
  • SecurityException: вызывается менеджером безопасности, чтобы указать на нарушение безопасности.
  • NullPointerException: возникает при вызове метода или свойства нулевого объекта.
Читайте также:  Редактировать excel файл python

Проверенное исключение в Java

Проверяемое исключение проверяется во время компиляции. Этот тип исключения расширяет класс Throwable.

Ниже приведены некоторые примеры непроверенного исключения:

Примечание. Kotlin не поддерживает проверенные исключения.

Блок try-catch в Kotlin

Блок try-catch в Котлин используется для обработки исключений в коде. Блок try содержит код, который может вызвать исключение, а блок catch используется для обработки исключения. Этот блок должен быть написан внутри метода. За блоком try Kotlin должен следовать либо блок catch, либо блок finally, либо и то, и другое.

Синтаксис try с блоком catch

try< //code that may throw exception >catch(e: SomeException) < //code that handles exception >Syntax of try with finally block
try < // some code >catch(e: SomeException) < // handler >finally < // optional finally block >

Синтаксис try catch с блоком finally

try < // some code >catch (e: SomeException) < // handler >finally < // optional finally block >

Проблема без обработки исключений

Давайте посмотрим на пример, который вызывает исключение, которое не обрабатывается.

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

Exception in thread "main" java.lang.ArithmeticException: / by zero at ExceptionHandlingKt.main(ExceptionHandling.kt:2)

Решение путем обработки исключений

Давайте посмотрим на решение вышеуказанной проблемы с помощью блока try-catch.

fun main(args: Array) < try < val data = 20 / 0 //may throw exception >catch(e: ArithmeticException) < println(e) >println("code below exception. ") >
java.lang.ArithmeticException: / by zero code below exception.

В приведенной выше программе после реализации блока try-catch выполняется остальная часть кода ниже исключения.

Блок try как выражение

Мы можем использовать блок try как выражение, которое возвращает значение. Значение, возвращаемое выражением try, является либо последним выражением блока try, либо последним выражением catch. Содержимое блока finally не влияет на результат выражения.

Пример Kotlin try выражения

Давайте рассмотрим пример блока try-catch как выражения, которое возвращает значение. В этом примере значение String равно Int, которое не генерирует никаких исключений и возвращает последний оператор блока try.

fun main(args: Array) < val str = getNumber("10") println(str) >fun getNumber(str: String): Int < return try < Integer.parseInt(str) >catch(e: ArithmeticException) < 0 >>

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

fun main(args: Array) < val str = getNumber("10.5") println(str) >fun getNumber(str: String): Int < return try < Integer.parseInt(str) >catch(e: NumberFormatException) < 0 >>

Kotlin finally Block

Kotlin finally Block всегда выполняется независимо от того, обрабатывается ли исключение или нет. Поэтому он используется для выполнения важных операторов кода.

Kotlin finally Block – пример 1

Давайте посмотрим на пример обработки исключения, в котором исключение не возникает.

fun main(args: Array) < try < val data = 10 / 5 println(data) >catch(e: NullPointerException) < println(e) >finally < println("finally block always executes") >println("below codes. ") >
2 finally block always executes below codes.

Пример 2

Давайте посмотрим на пример обработки исключения, в котором исключение возникает, но не обрабатывается.

fun main(args: Array) < try < val data = 5 / 0 println(data) >catch(e: NullPointerException) < println(e) >finally < println("finally block always executes") >println("below codes. ") >
finally block always executes Exception in thread "main" java.lang.ArithmeticException: / by zero

Пример 3

Давайте посмотрим на пример обработки исключения, в котором возникает и обрабатывается исключение.

fun main(args: Array) < try < val data = 5 / 0 println(data) >catch(e: ArithmeticException) < println(e) >finally < println("finally block always executes") >println("below codes. ") >
java.lang.ArithmeticException: / by zero finally block always executes below codes.

Примечание. Блок finally не будет выполнен, если программа завершится (вызовом exitProcess(Int) или любой ошибкой, которая приведет к прерыванию процесса).

Источник

Исключения

Все исключения в Kotlin являются наследниками класса Throwable . У каждого исключения есть сообщение, трассировка стека и (опционально) причина, по которой это исключение вероятно было вызвано.

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

Чтобы перехватить исключение, используйте выражение try . catch .

try < // some code >catch (e: SomeException) < // handler >finally < // optional finally block >

В коде может быть любое количество блоков catch (такие блоки могут и вовсе отсутствовать). Блоки finally могут быть опущены. Однако, должен быть использован как минимум один блок catch или finally .

Try — это выражение

try является выражением, что означает, что оно может иметь возвращаемое значение.

val a: Int? = try < input.toInt() >catch (e: NumberFormatException)

Возвращаемым значением будет либо последнее выражение в блоке try , либо последнее выражение в блоке catch (или блоках). Содержимое finally блока никак не повлияет на результат try -выражения.

Проверяемые исключения

В Kotlin нет проверяемых исключений. Для этого существует целый ряд причин, но мы рассмотрим простой пример, который иллюстрирует причину этого.

Приведённый ниже фрагмент кода является примером простого интерфейса в JDK, который реализован в классе StringBuilder .

Appendable append(CharSequence csq) throws IOException; 

Сигнатура говорит, что каждый раз, когда я присоединяю строку к чему-то (к StringBuilder , какому-нибудь логу, сообщению в консоль и т.п), мне необходимо отлавливать исключения типа IOExceptions . Почему? Потому, что данная операция может вызывать IO (Input-Output: Ввод-Вывод) ( Writer также реализует интерфейс Appendable ). Данный факт постоянно приводит к написанию подобного кода:

И это плохо. См. Effective Java, Item 77: Don’t ignore exceptions (не игнорируйте исключения).

Брюс Эккель как-то сказал о проверяемых исключения:

Examination of small programs leads to the conclusion that requiring exception specifications >could both enhance developer productivity and enhance code quality, but experience with large software projects suggests >a different result – decreased productivity and little or no increase in code quality. —>

Анализ небольших программ показал, что обязательная обработка исключений может повысить производительность разработчика и улучшить качество кода. Однако, изучение крупных проектов по разработке программного обеспечения позволяет сделать противоположный вывод: происходит понижение продуктивности и сравнительно небольшое улучшение кода (а иногда и без всякого улучшения).

Вот несколько других рассуждений по этому поводу:

Если вы хотите предупредить вызывающие объекты о возможных исключениях при вызове Kotlin кода из Java, Swift или Objective-C, вы можете использовать аннотацию @Throws . Узнайте больше об использовании этой аннотации для Java, а также для Swift и Objective-C.

Тип Nothing

throw в Kotlin является выражением, поэтому есть возможность использовать его, например, в качестве части Elvis-выражения:

val s = person.name ?: throw IllegalArgumentException("Name required") 

Типом выражения throw является специальный тип под названием Nothing . У этого типа нет никаких значений, он используется для того, чтобы обозначить те участки кода, которые могут быть не достигнуты никогда. В своём коде вы можете использовать Nothing для того, чтобы отметить функцию, чей результат никогда не будет возвращён.

fun fail(message: String): Nothing

При вызове такой функции компилятор будет в курсе, что исполнения кода далее не последует:

val s = person.name ?: fail("Name required") println(s) // известно, что переменная 's' проинициализирована к этому моменту 

Вы также можете столкнуться с этим типом при работе с выводом типов. Nullable-вариант этого типа Nothing? имеет ровно одно возможное значение — null . Если вы используете null для инициализации значения предполагаемого типа, и нет никакой другой информации, которую можно использовать для определения более конкретного типа, компилятор определит тип Nothing? .

val x = null // у 'x' тип `Nothing?` val l = listOf(null) // у 'l' тип `List

Совместимость с Java

См. раздел, посвящённый исключениям, Страница совместимости Java для получения информации о совместимости с Java.

Источник

Exceptions

All exception classes in Kotlin inherit the Throwable class. Every exception has a message, a stack trace, and an optional cause.

To throw an exception object, use the throw expression:

To catch an exception, use the try . catch expression:

There may be zero or more catch blocks, and the finally block may be omitted. However, at least one catch or finally block is required.

Try is an expression

try is an expression, which means it can have a return value:

The returned value of a try expression is either the last expression in the try block or the last expression in the catch block (or blocks). The contents of the finally block don’t affect the result of the expression.

Checked exceptions

Kotlin does not have checked exceptions. There are many reasons for this, but we will provide a simple example that illustrates why it is the case.

The following is an example interface from the JDK implemented by the StringBuilder class:

This signature says that every time I append a string to something (a StringBuilder , some kind of a log, a console, etc.), I have to catch the IOExceptions . Why? Because the implementation might be performing IO operations ( Writer also implements Appendable ). The result is code like this all over the place:

And that’s not good. Just take a look at Effective Java, 3rd Edition, Item 77: Don’t ignore exceptions.

Bruce Eckel says this about checked exceptions:

Examination of small programs leads to the conclusion that requiring exception specifications could both enhance developer productivity and enhance code quality, but experience with large software projects suggests a different result – decreased productivity and little or no increase in code quality.

And here are some additional thoughts on the matter:

If you want to alert callers about possible exceptions when calling Kotlin code from Java, Swift, or Objective-C, you can use the @Throws annotation. Read more about using this annotation for Java and for Swift and Objective-C.

The Nothing type

throw is an expression in Kotlin, so you can use it, for example, as part of an Elvis expression:

The throw expression has the type Nothing . This type has no values and is used to mark code locations that can never be reached. In your own code, you can use Nothing to mark a function that never returns:

When you call this function, the compiler will know that the execution doesn’t continue beyond the call:

val s = person.name ?: fail(«Name required») println(s) // ‘s’ is known to be initialized at this point

You may also encounter this type when dealing with type inference. The nullable variant of this type, Nothing? , has exactly one possible value, which is null . If you use null to initialize a value of an inferred type and there’s no other information that can be used to determine a more specific type, the compiler will infer the Nothing? type:

Java interoperability

Please see the section on exceptions in the Java interoperability page for information about Java interoperability.

Источник

Оцените статью