Kotlin 기초 - 예외 처리

코틀린의 예외 처리는 자바의 예외 처리와 비슷하다.

함수는 예외를 던질(throw) 수 있다. 함수를 호출하는 쪽에서는 이 예외를 잡아(catch) 처리할 수 있다. 예외를 처리하지 않으면 함수 호출 스택을 거슬러 올라가 예외를 처리하는 부분이 나올때까지 예외를 다시 던진다(rethrow).

코틀린에서 예외를 던지는 방법은 자바와 전혀 다르지 않다.

throw IllegalArgumentException("A percentage value must be between 0 and 100: $percentage")

다만 다른 클래스와 마찬가지로 예외 인스턴스를 만들 때 new 키워드를 사용하지 않는다. 또한 자바와 달리 코틀린의 throw는 식이므로 다른 식에 포함될 수 있다.

val percentage =
    if (number in 0..100)
        number
    else throw IllegalArgumentException("A percentage value must be between 0 and 100: $number")

try - catch - finally

자바와 마찬가지로 예외를 처리하려면 try - catch - finally 구문을 사용한다. 자바 코드와 가장 큰 차이는 throws 절이 코틀린에는 없다는 점이다. 자바의 경우 체크 예외(checked exception)는 예외 처리를 하지 않으려면 함수 선언 뒤에 throws <Checked exception>(,...)을 붙여야 한다. 그러나 코틀린은 체크 예외와 언체크 예외를 구분하지 않기 때문에 throws절을 사용하지 않는다.
따라서 자바와 달리 IOException같은 체크 예외를 무조건 처리할 필요가 없으며 throws 절을 사용할 필요가 없다.

fun readNumber(reader: BufferedReader): Int? {
    try {
        val line = reader.readLine()
        return line.toInt()
    } catch (e: NumberFormatException) {
        return null
    } finally {
        reader.close()
    }
}

try 식

예외처리에서 자바와 코틀린의 큰 차이는 try가 식이라는 점이다. 따라서 위 readNumber 함수를 더 간결하게 만들 수 있다.

fun readNumber(reader: BufferedReader) = try {
    reader.readLine().toInt()
} catch (e: NumberFormatException) {
    null
} finally {
    reader.close()
}

if, when 식과 다른 점이라면 try의 본문은 반드시 중괄호 {} 로 둘러싸야 한다. 다른 식과 마찬가지로 중괄호 내의 가장 마지막 식의 값이 전체 결과 값이 된다.


© 2021. All rights reserved.

Powered by Hydejack v9.1.6