반응형
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)
}
반응형
'Coding > Kotlin' 카테고리의 다른 글
[Kotlin in Action] 8. 코틀린 함수 호출 (매개변수 이름 명시, 디폴트 파라미터, 최상위 함수(유틸리티 클래스 없애기), 최상위 프로퍼티) (0) | 2022.05.18 |
---|---|
[Kotlin in Action] 7. 코틀린 컬렉션 만들기 (Set, Map, List) (0) | 2022.05.17 |
[Kotlin in Action] 5. while과 for 루프, Map 이터레이션, in으로 원소검사 (0) | 2022.05.15 |
[Kotlin in Action] 4. enum 과 when, 클래스 계층과 스마트 캐스트 (0) | 2022.05.14 |
[Kotlin in Action] 3. 클래스, 프로퍼티 (0) | 2022.05.13 |