본문 바로가기
Kotlin

[Kotlin in Action] 2.5 코틀린 예외 처리

by Nhahan 2025. 3. 14.

코틀린의 기본 예외 처리 구문은 자바와 비슷하다.

다만, 자바와 달리 코틀린의 throw는 식이므로 다른 식에 포함될 수 있다.

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

이 예제에서는 조건이 거짓이면 변수가 초기화되지 않는다.

 

2.5.1 try, catch, finally

fun readNumber(reader: BufferedReader): Int? { // 함수가 던질 수 있는 예외를 명시할 필요가 없다.
    try {
        val line = reader.readLine()
        return Integer.parseInt(line)
    }
    catch (e: NumberForamtException) {
        return null
    }
    finally {
        reader.close()
    }
}

자바 코드와 가장 큰 차이는 throws 절이 코드에 없다는 점이다. 자바에서는 함수를 작성할 때 함수 선언 뒤에 throws IOException(checked exception 이므로)을 붙여야 한다.

코틀린은 checked exception과 unchecked exception을 구별하지 않는다.

 

2.5.2 try를 식으로 사용

자바와 코틀린의 중요한 차이를 하나 더 살펴보기 위해 방금 살펴본 예제를 살짝 고쳐본다.

fun readNumber(reader: BufferedReader) {
    val number = try {
        Integer.parseInt(reader.readLine()) // 이 식의 값이 "try"식의 값이 된다.
    } catch (e: NumberFormatException) {
        return
    }
    println(number)
}

>>> val reader = BufferedReader(StringReader("not a number"))
>>> readNumber(reader) // 아무것도 출력되지 않는다.

코틀린의 try 키워드는 if나 when과 마찬가지로 식이다. 따라서 try의 값을 변수에 대입할 수 있다. if와 달리 try의 본문을 반드시 중괄호 {}로 둘러싸야 한다. 다른 문장과 마찬가지로 try의 본문도 내부에 여러 문장이 있으면 마지막 식의 값이 전체 결과 값이다.

 

예외 발생 시, 계속 진행하고 싶다면, catch 블록도 값을 만들어야한다.

fun readNumber(reader: BufferedReader) {
    val number = try {
        Integer.parseInt(reader.readLine()) // 이 식의 값이 "try"식의 값이 된다.
    } catch (e: NumberFormatException) {
        null
    }
    println(number)
}

>>> val reader = BufferedReader(StringReader("not a number"))
>>> readNumber(reader)
null

 

 

댓글