[Kotlin in Action] 6. 예외처리 (throw, try~catch~finally)

반응형
728x90
반응형

throw 예외처리

코틀린의 예외 처리는 자바나 다른 언어의 예외 처리와 비슷하다. 코틀린에서의 throw 예외처리 특징을 알아보자.

 

  • new 연산자를 사용하지 않아도 된다.
fun main() {
    val i = 50
    if (i !in 0.. 100) {
        // new 연산자를 사용하지 않아도 된다.
        throw IllegalArgumentException("exception : $i")
    }

    val percentage = exam(50)
    println(percentage)

}

 

  • throw는 식이다. 다른 식에 포함될 수 있다.
fun main() {
    val percentage = exam(101)
    println(percentage)

}

fun exam(i: Int) {
    val percentage =
        if (i in 0.. 100) {
            101
        } else {
            // throw 는 식이다. 그러므로 다른 식에 포함될 수 있다.
            throw IllegalArgumentException("exception : $i")
        }
}

 

결과
Exception in thread "main" java.lang.IllegalArgumentException: exception : 101
	at chapter2_코틀린기초._7_코틀린_예외처리.ThrowKt.exam(throw.kt:25)
	at chapter2_코틀린기초._7_코틀린_예외처리.ThrowKt.main(throw.kt:14)
	at chapter2_코틀린기초._7_코틀린_예외처리.ThrowKt.main(throw.kt)

 

 

try~catch~finally문

자바에서는 메서드 선언 뒤에 throws IOException 을 붙여야한다. IOException이 체크 예외기 때문이다. 코틀린은 체크예외, 언체크예외를 구별하지 않는다. 코틀린에서는 함수가 던지는 예외를 지정하지 않고 발생한 예외를 잡아내도 되고, 잡아내지않아도 된다.

import java.io.BufferedReader
import java.io.StringReader

fun main() {
    val reader = BufferedReader(StringReader("not a number"))
    readNumber(reader)
}

fun readNumber(reader: BufferedReader): Int? {
    try {
        // 함수가 던질 수 있는 예외를 명시할 필요가 없다.
        val line = reader.readLine()
        return Integer.parseInt(line)
    } catch (e: NumberFormatException) {
        // 예외 타입을 :의 오른쪽에 쓴다.
        return null
    } finally {
        // finally 는 자바와 똑같이 작동한다.
        reader.close()
    }
}
참고

코틀린에서는 try~with~resource문을 별도로 제공해주지 않는다. 하지만 라이브러리 함수와 같은 기능으로 구현할 수 있다.

 

 

추가 예제

fun main() {
    val reader = BufferedReader(StringReader("not a number"))
    readNumber2(reader) // 아무것도 출력하지 않는다.
    readNumber3(reader) // null 
}

fun readNumber2(reader: BufferedReader) {
    val number = try {
        Integer.parseInt(reader.readLine())
    } catch (e: NumberFormatException) {
        // NumberFormatException 가 발생했을 경우, 아무것도 출력되지 않는다.
        return
    }

    println(number)
}

fun readNumber3(reader: BufferedReader) {
    val number = try {
        Integer.parseInt(reader.readLine())
    } catch (e: NumberFormatException) {
        // null 을 출력한다.
        null
    }

    println(number)
}

 

 

반응형

Designed by JB FACTORY