신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

코틀린에서 예외처리하는 방식은 Java와 비슷합니다(거의 동일하다). 예외 처리를 하는 방식에는 2가지 방식이 있습니다. throw로 예외를 던지는 방식과 try, catch로 예외를 잡아서 처리하는 방식입니다.

 

첫번째 throw로 예외 던지기

예외를 던질때는 throw라는 키워드를 사용합니다. 이때, 발생한 예외를 잡아주지 않으면(try, catch) 함수를 호출 스택을 거슬러 올라가서 예외를 처리해주는 부분까지 예외를 다시 던집니다. 여기서 try, catch에 대해서는 아래에서 다루겠습니다.

 

throw로 예외를 던지는 예제를 살펴봅니다. 아래 예제는 퍼센트(percentage)는 0에서 100까지 표현이 가능합니다. 만약 0에서 100사이가 아닌 값이 들어오면 예외를 던지는 예제입니다.

 

fun main() {
    // Exception 던지기
    val percentage = 200
    if (percentage !in 0..100) {
        // 예외 인스턴스를 만들 때, new를 사용 할 필요없다.
        throw IllegalArgumentException("A percentage value must be between 0 and 100: ${percentage}")
    } else {
        println(percentage)
    }
}​

 

실행 결과

Exception in thread "main" java.lang.IllegalArgumentException: A percentage value must be between 0 and 100: 200

at exam02.ThrowExceptionKt.main(ThrowException.kt:11)

at exam02.ThrowExceptionKt.main(ThrowException.kt)

 

여기서 java와 다른점이 있는데, 잘보면 new를 사용하지 않고 예외 인스턴스를 생성하는 것을 볼 수 있습니다. 이 부분은 Java와 다른 점입니다.

 

두번째, try, catch 예외 처리하기

발생한 예외를 직접 잡아서 처리하고 싶을때, try, catch를 사용합니다. 방법은 Java와 동일합니다.

 

혹시 Java의 try, catch를 모르시는분을 위해 설명하자면, try{}에서 실행한 코드중에 오류가 발생하면 catch{}에서 해당 에러에 대해 오류 처리를 합니다. 그리고, 있어도 되고 없어도 되는 finally{}는 try{}가 정상적으로 실행이 되든, 에러가 발생해서 catch{}를 실행해 오류 처리를 하든 무조건 실행되는 부분입니다.

 

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

fun main() {
    val reader = BufferedReader(StringReader("123"))
    println(readNumber(reader))
}

fun readNumber(reader: BufferedReader): Int? {
    // 사용하는 방식은 Java와 같다. try, catch, finally
    try {
        val line = reader.readLine()
        return Integer.parseInt(line) // 숫자 형식이 아닌경우 에러 발생.
    } catch (e: NumberFormatException) {
        return null // 숫자 형식이 아님
    } finally {
        reader.close() // 정상적이든 오류든 무조건 실행
    }
}
​

 

"123"은 숫자형태의 문자열이기 때문에, 13번째줄에서 정상적으로 숫자로 파싱(parsing)이 됩니다. 정상 동작하여 catch를 실행하지 않습니다. 그리고, 16번째 줄의 finally가 실행되어 BufferedReader 객체를 닫아줍니다.

 

예외타입을 쓸때는 14번째 줄 처럼 e 뒤에 콜론(:)을 적고, 그 뒤에 예외 타입을 정의합니다.

 

실행 결과

123

 

만약, "123"이 아닌 문자형태의 문자열을 넣어주게되면 에러가 발생해서 catch{}가 실행됩니다. 그래서 null값을 반환합니다.

val reader = BufferedReader(StringReader("error"))
println(readNumber(reader))​

 

실행 결과

null

 

정리.

try{}에서 에러가 발생하면 catch{}에서 처리한다.

finally{}는 정상동작을 하든 에러가 발생하든 무조건 실행한다.

 

코틀린에서는 try를 식으로 사용할 수도 있습니다.

try 식 사용하기

예제는 위와 같습니다.

 

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

fun main() {
    // 코틀린에서는 try를 식으로 사용할 수 있다.
    val num = try {
        Integer.parseInt(BufferedReader(StringReader("not a number")).readLine())
    } catch(e: NumberFormatException) {
        return // 아무런 값도 나오지 않는다. 
    }

    println(num)
}​

 

try 식을 이용하였는데, 오류가 발생하면 catch에서 예외를 잡아서 아무런 값도 출력하지 않는다.

7번째 줄을 보면 "not a number"는 숫자가 아니기 때문에 오류가 발생합니다.

 

9번째 줄에 return 대신 null을 쓰면, 결과는 null을 반환 합니다.

 

 

 

다른 글

2019/02/14 - [Language/Kotlin] - 코틀린 맵(map) 이터레이터

 

코틀린 맵(map) 이터레이터

코틀린의 이터레이터 맵(map)에 대해 살펴봅시다. for와 while도 있지만, 해당 글에서는 다루지 않습니다. 궁근하신 분은 아래 링크를 통해 확인 할 수 있습니다. 2019/02/13 - [Language/Kotlin] - 코틀린의 이터..

hongku.tistory.com

2019/02/20 - [Language/Kotlin] - 코틀린에서 in으로 범위 원소 검사하기

 

코틀린에서 in으로 범위 원소 검사하기

본 글은 Dmitry Jemerov, Svetlana Isakova의 "Kotlin in action" 책을 참고하여 작성한 글입니다. 코틀린에서 in을 이용해서 할 수 있는 것들이 굉장히 많습니다. 대표적으로 범위 안의 원소를 검사할 때 사용하..

hongku.tistory.com

2019/02/13 - [Language/Kotlin] - 코틀린의 이터레이션 for, while 루프

 

코틀린의 이터레이션 for, while 루프

코틀린에서의 가장 기본이 되는 이터레이션에는 for와 while 루프가 있습니다. while문과 같은 경우는 Java와 동일하기 때문에 따로 설명할 필요는 없을 것 같습니다. while문 그래도 간단하게 설명하면, while문..

hongku.tistory.com

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기