Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
require() / check() / error()
Kotlinの『require()』『check()』『error()』は前提条件や状態を検証するための標準関数です。条件が満たされない場合に例外を投げ、コードの意図を明確に表現できます。
構文
// 引数の前提条件チェック(IllegalArgumentException)
require(条件) { "エラーメッセージ" }
requireNotNull(値) { "値が null のときのメッセージ" }
// 状態の前提条件チェック(IllegalStateException)
check(条件) { "エラーメッセージ" }
checkNotNull(値) { "値が null のときのメッセージ" }
// 常に例外を投げる(IllegalStateException)
error("エラーメッセージ")
関数一覧
| 関数 | 投げる例外 | 概要 |
|---|---|---|
| require(cond) { msg } | IllegalArgumentException | 引数の検証。条件が false なら例外を投げます。 |
| requireNotNull(v) { msg } | IllegalArgumentException | 引数が null なら例外を投げます。non-null 型を返します。 |
| check(cond) { msg } | IllegalStateException | 状態の検証。条件が false なら例外を投げます。 |
| checkNotNull(v) { msg } | IllegalStateException | 状態が null なら例外を投げます。non-null 型を返します。 |
| error(msg) | IllegalStateException | 常に例外を投げます。到達不能なコードパスに使います。 |
サンプルコード
class BankAccount(initialBalance: Double) {
private var balance: Double = initialBalance
private var isOpen: Boolean = true
init {
// コンストラクタ引数の検証
require(initialBalance >= 0) { "初期残高は0以上が必要です(入力: $initialBalance)" }
}
fun deposit(amount: Double) {
require(amount > 0) { "入金額は0より大きい必要があります" }
check(isOpen) { "口座がすでに閉鎖されています" }
balance += amount
println("入金: $amount → 残高: $balance")
}
fun close() {
isOpen = false
}
}
fun processInput(input: String?) {
// requireNotNull で non-null の値を取得します。
val value = requireNotNull(input) { "入力は null にできません" }
println("処理: $value") // value は String(non-null)
}
fun getDayName(day: Int): String = when (day) {
1 -> "月曜"
2 -> "火曜"
// ...
else -> error("無効な曜日: $day") // 到達すべきでないパス
}
fun main() {
val account = BankAccount(1000.0)
account.deposit(500.0) // 入金: 500.0 → 残高: 1500.0
try {
account.deposit(-100.0) // IllegalArgumentException
} catch (e: IllegalArgumentException) {
println("引数エラー: ${e.message}")
}
account.close()
try {
account.deposit(100.0) // IllegalStateException
} catch (e: IllegalStateException) {
println("状態エラー: ${e.message}")
}
processInput("Hello") // 処理: Hello
println(getDayName(1)) // 月曜
try {
println(getDayName(8)) // IllegalStateException
} catch (e: IllegalStateException) {
println("エラー: ${e.message}")
}
}
概要
『require()』は引数の検証(関数の入口で使う)、『check()』は状態の検証(オブジェクトの状態が正しいか確認する)という使い分けが一般的です。
メッセージをラムダで遅延評価するため、条件が true の場合は文字列が生成されず効率的です。
try-catch による例外処理はtry / catch / finallyを参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。