Kotlin Academy · レッスン

!!演算子

強制的なNon-Null化とそのリスクを学びます

レッスン 3/413 ステップ

「!!演算子」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

null非許容の強制

null許容の値がnullではないと確信していても、コンパイラーが警告することがあります。

null非許容アサーション演算子 !! は、コンパイラーに値をnull非許容として扱うよう指示します。

基本的な使い方

!! を追加すると、null許容型が対応するnull非許容型に変換されます。

値が実際にnullでなければ、コードは通常の呼び出しとまったく同じように動作します。

fun main() {
    val name: String? = "Kotlin"
    println(name!!.length)
}

危険性

値が実際には null の場合、!! はその場で NullPointerException をスローします。

KotlinでNPEが発生することを許している唯一の場所であり、その結果は完全にあなたの責任です。

fun main() {
    val name: String? = null
    try {
        println(name!!.length)
    } catch (e: NullPointerException) {
        println("Boom: NullPointerException")
    }
}

存在する理由

この演算子は意図的に扱いづらい見た目になっています。2つの感嘆符はコードレビューで目立つため、安全策を回避した箇所であることを示せます。

コンパイラーよりも自分のほうが確実に多くを把握している、まれなケースのために存在します。

通常はセーフコールのほうが適切

ほとんどの場合、エルビス演算子 ?: と組み合わせたセーフコール ?. のほうが安全で、長さも同程度です。

同じ目的に対する2つの方法を、以下で比較してみましょう。

fun main() {
    val name: String? = null
    val safeLength = name?.length ?: 0
    println(safeLength)
}

!!の連鎖を避ける

a!!.b!!.c のように、複数の !! を決して連鎖させないでください。クラッシュしたとき、どの部分がnullだったのか分からなくなります。

式を分解するか、代わりにセーフコールを使ってください。

fun main() {
    val text: String? = "hi"
    // bad style: text!!.uppercase()!! is hard to debug
    val good = text?.uppercase() ?: ""
    println(good)
}

正当な使用例

許容できるケースの1つは、以前に設定し、現時点では初期化済みだと分かっている値です。

それでも、可能であれば lateinit を使うか、構造を見直すことを優先してください。

fun main() {
    var config: String? = null
    config = "loaded"
    // we just assigned it, so !! is safe here
    println(config!!.uppercase())
}

スタックトレースの読み方

!! が失敗すると、例外は正確な行を指し示します。誤った結果が黙って返される場合と比べて、この正確さが唯一の利点です。

メッセージを使って、誤っていた前提を見つけて修正してください。

fun length(text: String?): Int {
    return text!!.length
}

fun main() {
    println(length("abc"))
    // length(null) would throw on the !! line
}

!!を取り除くリファクタリング

ほとんどの !! は、nullを適切に処理することで取り除けます。以下では、エルビス演算子によるフォールバックによって、関数がすべての入力に対応し、クラッシュしないようになっています。

fun length(text: String?): Int {
    return text?.length ?: 0
}

fun main() {
    println(length("abc"))
    println(length(null))
}

経験則

すべての !! を次の問いかけとして捉えてください。これは絶対にnullにならないと確信できますか?

  • はい、しかもまれなケース → 使用しても構いません
  • 確信がない → ?. と ?: を使ってください

まとめて確認

!! 演算子は扱いに注意が必要な強力なツールです。

  • null許容型をnull非許容型に強制的に変換します
  • 値がnullの場合、NullPointerExceptionをスローします
  • ほぼすべてのケースで、セーフコールとエルビス演算子を優先してください
fun main() {
    val sure: String? = "definitely here"
    println(sure!!.length)
    val maybe: String? = null
    println(maybe?.length ?: -1)
}

理解度チェック

null非許容アサーション演算子の理解度を確認しましょう。

まとめ

!! 演算子について学びました。

  • null許容の値がnullではないことをアサートします
  • 前提が間違っているとNullPointerExceptionをスローします
  • 習慣的に使うのではなく、最後の手段にするべきです

次は、プラットフォーム型を通じてJavaからnull許容性がどのように入ってくるかを見ていきます。

無料で開始

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は初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「!!演算子」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. Nullable型とNon-Null型
  2. 安全呼び出しとElvis
  3. !!演算子
  4. プラットフォーム型
← Kotlin Academyに戻る