Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Kotlin辞典

  1. トップページ
  2. Kotlin辞典
  3. !! 非nullアサーション

!! 非nullアサーション

Kotlinの『!!』(非nullアサーション演算子)は、Nullable型の値をnon-null型として扱う演算子です。値がnullの場合は『KotlinNullPointerException』がスローされます。

構文
// !! 演算子で Nullable 型を non-null 型に変換します。
val name: String? = "Alice"
val length: Int = name!!.length  // String? → String として扱います。

// null の場合は KotlinNullPointerException がスローされます。
val nullValue: String? = null
val len = nullValue!!.length  // 例外スロー
構文一覧
構文概要
value!!null でなければ non-null 型として返します。null なら KotlinNullPointerException をスローします。
value!!.method()null チェックなしでメソッドを呼び出します。null なら例外がスローされます。
value!!.propertynull チェックなしでプロパティにアクセスします。
サンプルコード
// !! 演算子のデモ
fun getUser(id: Int): String? = if (id > 0) "User-$id" else null

fun main() {
    // null でない場合は正常に動作します。
    val name: String? = "Alice"
    println(name!!.length)   // 5
    println(name!!.uppercase())  // ALICE

    // スマートキャストが使えない外部関数の結果に使う例
    val user = getUser(1)!!  // null でないことが分かっている場合
    println("ユーザー: $user")  // ユーザー: User-1

    // !! を使わない安全な代替手法との比較
    val nullable: String? = "Kotlin"

    // 方法1: !! (nullなら例外)
    println(nullable!!.length)  // 6

    // 方法2: ?.let(安全)
    nullable?.let { println(it.length) }  // 6

    // 方法3: ?: (nullなら代替値)
    println(nullable?.length ?: 0)  // 6

    // null の場合に !! を使うと例外が発生します。
    try {
        val nullStr: String? = null
        println(nullStr!!.length)  // ここで例外
    } catch (e: NullPointerException) {
        println("例外キャッチ: ${e::class.simpleName}")  // KotlinNullPointerException
    }
}
概要

『!!』演算子はKotlinのNull安全機能をバイパスするため、使用は最小限にすべきです。プロダクションコードで多用すると、Javaの`NullPointerException`と同様の問題が発生します。

注意: nullが確実に入ってこないとわかっている箇所以外での『!!』の使用は危険です。代わりに『?.』演算子や『?:』エルビス演算子、『?.let』によるスマートキャストを検討してください。

Nullable型の基本はNullable 型 / ?. 演算子を、デフォルト値の設定には?: エルビス演算子を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。