코틀린에서 Exception
처리는 Java나 다른 언어와 비슷하다.
함수를 정상적으로 종료할 수 있지만 오류가 발생하면 Exception
을 throw
할 수 있다.
함수를 호출하는 쪽에서 그 Exception
을 잡아 처리하거나 함수 호출 단에서 catch
하지 않는다면 함수 호출 스택을 거슬러 올라가면서 Exception
을 처리하는 부분이 나올 때까지 Exception
을 rethrow
한다.
코틀린의 throw
는 expression
이므로 다른 expression
에 포함될 수 있다.
val percentage =
if (number in 1..100)
number
else
throw IllegalArgumentException(
"A percentage value must be between 0 and 100: $number")
try
, catch
, finally
Exception
을 처리하려면 try
와 catch
, finally
절을 함께 사용한다.fun readNumber(reader: BufferedReader): Int? { // 함수가 던질 수 있는 Exception을 명시할 필요가 없다.
try {
val line = reader.readLine()
return line.toInt()
} catch (e: NumberFormatException) {
return null
} finally { // finally는 Java와 똑같이 작동한다.
reader.close()
}
}
-> Java 코드와 가장 큰 차이는 throws
절이 코드에 없다는 점이다. Java에서는 함수 선언 뒤에 throws IOException
을 붙여야한다. 왜냐하면 IOException
이 체크 예외이기 때문이다.
Java에서는..
체크 예외(Check Exception)
RuntimeExeception 클래스를 상속하지 않은 Exception 클래스들이다. 체크 예외는 예외가 발생할 수 있는 메소드를 사용할 경우 반드시 예외를 처리하는 코드를 함께 작성해야 한다. 예외를 처리하기 위해서 catch문으로 잡거나 throws를 통해 메소드 밖으로 던질 수 있다. 만약 예외를 처리하지 않으면 컴파일 에러가 발생한다.
언체크 예외(Uncheck Exception)
RuntimeException 클래스를 상속한 Exception 클래스들은 예외 처리를 강제하지 않기 때문에 언체크 예외라고 불린다. 에러를 처리하지 않아도 컴파일 에러가 발생하지 않는다. RuntimeException은 주로 프로그램에 문제가 있을 때 오류가 발생하도록 의도된 것으로 대표적으로 NullPointerException이 있다. 즉, RuntimeException은 예상치 못했던 상황에서 발생하는 것이 아니므로 굳이 예외 처리를 강제하지 않는다.
이에 반해 코틀린에서는 체크 예외와 언체크 예외를 구별하지 않는다. 그래서 함수가 던지는 Exception
을 잡아내도 되고 잡아내지 않아도 된다. 그리고 Java 7의 자원을 사용하는 try-with-resource
의 경우 코틀린에선 그런 경우를 위한 특별한 문법을 제공하진 않지만 라이브러리 함수로 같은 기능을 구현한다.
try를 Expression으로 사용하기
fun readNumber(reader: BufferedReader) {
val number = try {
reader.readLine().toInt()
} catch (e: NumberFormatException) {
null
}
println(number)
}
-> try
키워드는 if
나 when
과 마찬가지로 expression
이다. 그러나 if
와 달리 try
의 본문은 반드시 중괄호로 둘러싸야 한다.