Kotlin Academy · レッスン

!!演算子:避けるべき場面と理由

non-nullアサーション演算子とそのリスク、よりよい代替手段を理解します。

レッスン 4/413 ステップ

「!!演算子:避けるべき場面と理由」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Nullable型と?修飾子
  2. 実際のコードで使う安全呼び出し?.とElvis ?:
  3. Nullableレシーバーで使うlet、also、run
  4. !!演算子:避けるべき場面と理由
← Kotlin Academyに戻る