신규 블로그를 만들었습니다!
코틀린에서 예외처리하는 방식은 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) 이터레이터
2019/02/20 - [Language/Kotlin] - 코틀린에서 in으로 범위 원소 검사하기
2019/02/13 - [Language/Kotlin] - 코틀린의 이터레이션 for, while 루프
'Language > Kotlin' 카테고리의 다른 글
코틀린의 메소드 디폴트 값, @JvmOverloads (0) | 2019.03.03 |
---|---|
코틀린의 집합, 리스트, 맵 (0) | 2019.02.25 |
코틀린에서 in으로 범위 원소 검사하기 (0) | 2019.02.20 |
코틀린 설치, 인텔리제이와 JDK 설치 (0) | 2019.02.15 |
코틀린 맵(map) 이터레이터 (0) | 2019.02.14 |
최근댓글