На этом шаге мы рассмотрим совместимость исключений в Kotlin и Java.
Герой научил монстра Jhava своему языку, и монстр теперь хочет пожать ему руку в знак дружбы... или нет. Добавим метод extendHandInFriendship() в Jhava.java.
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class Jhava { . . . . public void offerFood() { Hero.handOverFood("pizza"); } public void extendHandInFriendship() throws Exception { throw new Exception(); } }
Рис.1. Возбуждение исключения в Java (Hero.kt)
Вызовем этот метод в Hero.kt.
@file:JvmName("Hero") fun main(args: Array<String>) { . . . . adversary.offerFood() adversary.extendHandInFriendship() } fun makeProclamation() = "Greetings, beast!"
Рис.2. Вызов метода, возбуждающего исключение (Hero.kt)
Запустите этот код, и вы увидите, как во время выполнения возникнет исключение (рисунок 3). Ведь доверять монстру - не очень умно.
Рис.3. Возникновение исключения
Вспомните, что в Kotlin все исключения непроверяемые. Вызывая extendHandInFriendship(), вы вызвали метод, генерирующий исключение. В этом случае вы точно знали, что так и будет. В других случаях может так не повезти. Стоит внимательно относиться к Java API, с которым вы взаимодействуете из Kotlin.
Заключите вызов extendHandInFriendship() в блок try/catch, чтобы пресечь предательство монстра.
@file:JvmName("Hero") fun main(args: Array<String>) { . . . . adversary.offerFood() try { adversary.extendHandInFriendship() } catch (e: Exception) { println("Begone, foul beast!") } } fun makeProclamation() = "Greetings, beast!"
Рис.4. Обработка исключения в try/catch (Hero.kt)
Запустите Hero.kt, чтобы увидеть, увернулся ли герой от подлой атаки монстра.
Рис.5. Результат работы приложения
На следующем шаге мы закончим изучение этого вопроса.