В Java исключения делятся на:
IOException
)NullPointerException
)Kotlin сознательно отказался от checked exceptions. Рассмотрим причины:
Checked exceptions приводят к "загрязнению" сигнатур методов и избыточным блокам try-catch:
public void readFile() throws IOException {
// код чтения файла
}
fun readFile() {
// код чтения файла
}
Checked exceptions плохо сочетаются с функциональным стилем:
files.forEach(file -> {
try {
readFile(file);
} catch (IOException e) { ... }
});
Практика показала, что разработчики часто:
try {
// код
} catch (IOException e) {
throw new RuntimeException(e);
}
Kotlin поощряет использование:
fun readFile(): Result<String> = runCatching {
// код, который может выбросить исключение
}
fun readFile(): Result<String> {
return try {
Result.success(file.readText())
} catch (e: IOException) {
Result.failure(e)
}
}
sealed class FileReadResult {
data class Success(val content: String) : FileReadResult()
data class Error(val exception: Throwable) : FileReadResult()
}
Для совместимости с Java можно явно указать исключения:
@Throws(IOException::class)
fun readFile() { ... }
Вместо checked exceptions Kotlin предлагает:
@ExperimentalCoroutinesApi
Разработчики Kotlin (JetBrains) изучили многолетний опыт Java и пришли к выводам:
Основные причины отказа:
Альтернативы в Kotlin:
Преимущества подхода Kotlin:
Отказ от checked exceptions — сознательное дизайн-решение, направленное на создание более практичного и выразительного языка.