반응형
Kotlin 예외처리 함수 require(), check()
require(), requireNotNull() 함수
require()
: 매개변수의 값이 참인지 체크, 거짓이라면 throw IllegalArgumentException
requireNotNull()
: 매개변수의 값이 null이 아니면 value를 반환, null이면 throw IllegalArgumentException
* 일반적으로 IllegalArgumentException은 적절하지 않은 인자를 전달했을 때 발생시키는 Exception
함수 원형
// 참이 아니라면 throw IllegalArgumentException("Failed requirement.")
public inline fun require(value: Boolean): Unit {
contract {
returns() implies value
}
require(value) { "Failed requirement." }
}
// 참이 아니라면 throw IllegalArgumentException(lazyMessage().toString())
public inline fun require(value: Boolean, lazyMessage: () -> Any): Unit {
contract {
returns() implies value
}
if (!value) {
val message = lazyMessage()
throw IllegalArgumentException(message.toString())
}
}
// null이 아니면 value를 반환, null이면 throw IllegalArgumentException("Required value was null.")
public inline fun <T : Any> requireNotNull(value: T?): T {
contract {
returns() implies (value != null)
}
return requireNotNull(value) { "Required value was null." }
}
// null이 아니면 value를 반환, null이면 throw IllegalArgumentException(lazyMessage().toString())
public inline fun <T : Any> requireNotNull(value: T?, lazyMessage: () -> Any): T {
contract {
returns() implies (value != null)
}
if (value == null) {
val message = lazyMessage()
throw IllegalArgumentException(message.toString())
} else {
return value
}
}
require() 예시
코틀린에서는 require()
를 사용한다면 아래와 같이 valueCheck를 할 수 있습니다.
// require() 예시
fun calculate(value: String?) {
// 적용 전
if(value.isNullOrEmpty()) {
throw IllegalArgumentException("값이 null 혹은 공백일 수 없습니다.")
}
// 적용 후
require(!value.isNullOrEmpty()) { "입력값이 null 혹은 공백일 수 없습니다."}
}
requireNotNull() 예시
코틀린에서는 requireNotNull()
을 사용한다면 아래와 같이 null check를 할 수 있습니다.
// requireNotNull() 예시
enum class Operator(val op: String) {
PLUS("+"), MINUS("-")
}
// 적용 전
fun convertToOperator(op: String): Operator {
return values().firstOrNull { it.op == op } ?: throw IllegalArgumentException("사칙연산 기호가 아닙니다.")
}
// 적용 후
fun convertToOperator(op: String): Operator {
return requireNotNull(values().firstOrNull { it.op == op }) { "사칙연산 기호가 아닙니다." }
}
check(), checkNotNull() 함수
check()
: 매개변수의 값이 참인지 체크, 아니라면 throw IllegalStateException
checkNotNull()
: 매개변수의 값이 null이 아니면 value를 반환, null이면 throw IllegalStateException
* 일반적으로 IllegalStateException은 메소드를 호출할 상태(State)가 아닐 때 발생시키는 Exception.
함수 원형
// 참이 아니라면 throw IllegalStateException("Checked Failed.")
public inline fun check(value: Boolean): Unit {
contract {
returns() implies value
}
check(value) { "Check failed." }
}
// 참이 아니라면 throw IllegalStateException(lazyMessage().toString())
public inline fun check(value: Boolean, lazyMessage: () -> Any): Unit {
contract {
returns() implies value
}
if (!value) {
val message = lazyMessage()
throw IllegalStateException(message.toString())
}
}
// null이 아니면 value를 반환, null이면 throw IllegalStateException("Required value was null.")
public inline fun <T : Any> checkNotNull(value: T?): T {
contract {
returns() implies (value != null)
}
return checkNotNull(value) { "Required value was null." }
}
// null이 아니면 value를 반환, null이면 throw IllegalArgumentException(lazyMessage().toString())
public inline fun <T : Any> checkNotNull(value: T?, lazyMessage: () -> Any): T {
contract {
returns() implies (value != null)
}
if (value == null) {
val message = lazyMessage()
throw IllegalStateException(message.toString())
} else {
return value
}
}
check() 예시
코틀린에서는 check()
를 사용한다면 아래와 같이 valueCheck를 할 수 있습니다.
fun connect(isConnected: Boolean, connectJob: () -> Unit) {
// 적용 전
if(isConnected) {
throw IllegalStateException("이미 연결되어있습니다.")
}
// 적용 후
check(!isConnected) { "이미 연결되어 있습니다" }
connectJob()
}
checkNotNull() 예시
코틀린에서는 checkNotNull()
을 사용한다면 아래와 같이 null check를 할 수 있습니다.
class BleDevice {
var connectedState: String? = null
fun connect(connectJob: () -> Unit) {
// 적용 전
val state = if (connectedState == null) {
throw IllegalStateException("State is null")
} else {
connectedState
}
// 적용 후
val state2 = checkNotNull(connectedState)
connectJob()
}
}
반응형