!!演算子:避けるべき場面と理由
non-nullアサーション演算子とそのリスク、よりよい代替手段を理解します。
「!!演算子:避けるべき場面と理由」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
!! とは何か
非 null アサーション演算子 !! は、nullable 型を非 null 型に変換します。実行時に値が null の場合は、NullPointerException をスローします。
!! の基本的な使い方
x!! は、x が非 null なら x を返し、それ以外の場合は NPE をスローします。
fun main() {
val name: String? = "Kotlin"
val len: Int = name!!.length // 6
println(len)
}!! は null で例外をスローする
値が実際に null の場合、Kotlin が防ごうとしているまさにその例外が発生します。
fun main() {
val name: String? = null
try {
println(name!!.length)
} catch (e: NullPointerException) {
println("NPE caught!")
}
}より良い方法:セーフコール
!! の代わりに ?. を優先してください。クラッシュせずに穏当な処理ができます。
fun main() {
val name: String? = null
val len = name?.length
println(len) // null — no crash
}より良い方法:Elvis 演算子
?. と ?: を組み合わせて、適切なデフォルト値を指定してください。
fun main() {
val name: String? = null
val len = name?.length ?: 0
println(len) // 0
}より良い方法:スマートキャスト
if (x != null) で確認するとスマートキャストが有効になるため、!! は必要ありません。
fun main() {
val name: String? = "Alice"
if (name != null) {
println(name.length) // smart-cast to String
}
}より良い方法:requireNotNull
値が必ず存在する必要がある場合は、requireNotNull(x) { "..." } によって意味のある IllegalArgumentException をスローできます。
fun process(name: String?) {
val safe = requireNotNull(name) { "name is required" }
println("processing $safe")
}
fun main() {
process("Ada")
// process(null) // throws IllegalArgumentException: name is required
}より良い方法:checkNotNull
checkNotNull(x) も同様に動作しますが、IllegalStateException をスローします。不変条件の確認に使用してください。
class Service {
private var data: String? = null
fun load() { data = "loaded" }
fun read(): String = checkNotNull(data) { "load() must be called first" }
}
fun main() {
val s = Service()
s.load()
println(s.read())
}!! の正当な使用例
まれですが、有効な場合もあります。null でないことがコンパイル時に証明できないものの、実際には null が存在しない不変条件の場合です(例:リフレクション呼び出しの後)。理由をコメントに残してください。
fun main() {
val list = listOf(1, 2, 3)
val firstEven: Int = list.find { it % 2 == 0 }!! // safe: we know list has an even
println(firstEven)
}連続した !! — 最大のアンチパターン
チェーン内に複数の !! があるのはコードの悪臭です。セーフコールとガード節を使ってリファクタリングしてください。
class A(val b: B?)
class B(val c: C?)
class C(val name: String?)
fun main() {
val a: A? = A(B(C("ok")))
// BAD: val n = a!!.b!!.c!!.name!!
val n = a?.b?.c?.name ?: "unknown"
println(n)
}!! を取り除くリファクタリング
!! を、より実態に即した API に置き換えてください。nullable な戻り値、入口での requireNotNull、または早期 return を使用します。
fun firstUpper(s: String?): String? = s?.firstOrNull()?.uppercase()
fun main() {
println(firstUpper("alice")) // A
println(firstUpper("")) // null
println(firstUpper(null)) // null
}簡単な確認
実行時に実際には null である値に !! を適用すると、どうなりますか?
まとめ
!! は Kotlin の null 安全性を無効にするための抜け道です。?.、?:、スマートキャスト、requireNotNull、または checkNotNull を優先してください。!! は、コンパイラーが証明できない不変条件を文書化したうえで、その場合に限って使用してください。
AI チューターと学ぶ Kotlin — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 51
- レッスン
- 203
よくある質問
「!!演算子:避けるべき場面と理由」レッスンは無料ですか?
はい。「!!演算子:避けるべき場面と理由」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「!!演算子:避けるべき場面と理由」で何を学びますか?
non-nullアサーション演算子とそのリスク、よりよい代替手段を理解します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「!!演算子:避けるべき場面と理由」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。