코틀린(Kotlin)

코틀린(kotlin) : Exceptions 예외 Throwable

알통몬_ 2018. 2. 8. 18:00
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


Exceptions : 예외

Exception Classes

코틀린의 모든 예외 클래스는 Throwable 의 하위에 있습니다.

그리고 모든 예외는 Message, stacktrace, cause 멤버를 가집니다.


예외 객체를 throw 하려면 throw-expression을 사용하면 됩니다.

throw Exception("Hello world")


예외를 잡을 때는 try-catch 문을 씁니다. finally {}는 옵션입니다.

try {

} catch (e : Exception) {
e.message

} finally {

}


Try is an expression

try 는 expression 입니다 즉, 반환 값을 가집니다.

val tc = try{ println("hello world") } catch (e : Exception) { null }

반환되는 값은 try {} 블록 안의 가장 마지막 코드이거나, catch{} 블록 안의 가장

마지막 코드입니다.


Checked Exceptions

코틀린은 예외를 체크하지 않습니다. 여러가지 이유가 있지만,

간단한 예제를 보겠습니다.

아래는 StringBuilder 클래스로 구현된 JDK 인터페이스 예제입니다.

Appendable append(CharSequence csq) throws IOEcxception;

위 코드는 무엇을 의미할까요?

어떠한 CharSequence를 append 할 때마다 IOException을 잡아야 한다는 것입니다.

때문에 StringBuilder 클래스의 append 메서드를 사용하려면

try { ... } catch(IOException ioe) { ... } 으로 감싸야 합니다.

그리고 이 코드는 좋지 않다고 Effective Java, Item65 : Don't ignore eceptions.

에서 말하고 있습니다.


Bruce Eckel은 '자바가 Checked Exceptions 를 필요로 하는가?' 라고 말합니다.

[ 소규모의 프로그램을 검토했을 때에는 Checked Exceptions 를 하면 코드의 품질이 

향상되고 개발자의 생성성도 좋아지지만, 대규모 프로젝트에서 봤을 때는 생산성의

저하나 품질의 향상이 거의 없음을 의미합니다. ]

또 다른 인용문들

http://radio-weblogs.com/0122027/stories/2003/04/01/JavasCheckedExceptionsWereAMistake.html

http://www.artima.com/intv/handcuffs.html


The Nothing type : Nothing 타입

코틀린에서 expression 입니다. 때문에 아래처럼 사용할 수 있습니다.

fun main(args: Array<String>) {
val person = Person(null)
val tc = person.name ?: throw IllegalArgumentException("Name required")
print(tc)
}
data class Person(val name : String?)


throw expression의 타입은 특별한 타입인 Nothing 입니다.

이 타입은 값이 없고, 절대 도달할 수 없는 코드 위치를 표시하는데 사용됩니다.

Nothing 타입은 메서드의 반환 타입으로 사용할 수도 있습니다.

fun whenFailed() : Nothing {
throw IOException("name required")
}

이 메서드를 호출하면 컴파일러는 컴파일러는 더 이상 진행하면 안된다는 것을 알게 됩니다.


Nothing 타입이 나올 수 있는 또 다른 경우는 변수의 타입을 유추할 때 입니다.

val x = null
println((x is Nothing?))
val l = listOf(null)
print(l)

위 두 경우에 

x 는 Nothing? 타입이 되고

l 은 List<Nothing?> 타입이 됩니다.

각 실행 결과는

true

[null] 입니다.


이상입니다.

다음 포스팅에서는 Annotation 에 대해서 공부합니다.

감사합니다.

반응형