Caution

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

Kotlin辞典

  1. トップページ
  2. Kotlin辞典
  3. Nullable型 / ?. 演算子

Nullable型 / ?. 演算子

KotlinはNull安全(Null Safety)を型システムで保証しています。通常の型はnullを持てず、null値を格納したい場合は『型名?』のNullable型を使います。Nullable型への操作は『?.』(安全呼び出し演算子)を使ってnullアクセスを防ぎます。

構文
// Nullable 型の宣言
var name: String? = "Alice"
name = null  // OK

// 非 Nullable 型には null を代入できません。
// var nonNull: String = null  // コンパイルエラー

// 安全呼び出し演算子(?.)— null ならスキップして null を返します。
val length = name?.length       // String? 型(null の可能性あり)
val upper = name?.uppercase()   // null なら null、あれば大文字化

// チェーン呼び出し
val trimmed = name?.trim()?.uppercase()
構文一覧
構文概要
型?Nullable 型です。null を格納できます。
?.メソッド()安全呼び出しです。null のときはスキップして null を返します。
?.プロパティ安全プロパティアクセスです。null のときは null を返します。
if (x != null)null チェック後のブロック内では自動的にスマートキャストされます。
?.let { }null でないときだけブロックを実行します。
サンプルコード
fun getUser(id: Int): String? {
    return if (id == 1) "Alice" else null
}

fun main() {
    // Nullable 型の基本
    var name: String? = "Alice"
    println(name)           // Alice
    name = null
    println(name)           // null

    // 安全呼び出し演算子(?.)
    val user1 = getUser(1)
    val user2 = getUser(99)

    println(user1?.length)      // 5
    println(user2?.length)      // null (NullPointerException にはなりません)

    // チェーン呼び出し
    println(user1?.uppercase()?.reversed())  // ECILA
    println(user2?.uppercase()?.reversed())  // null

    // null チェック後のスマートキャスト
    val value: String? = "Hello, Kotlin!"
    if (value != null) {
        // このブロック内では value は String 型(非 Nullable)として扱えます。
        println(value.length)       // 14(?.は不要)
        println(value.uppercase())  // HELLO, KOTLIN!
    }

    // ?.let で null でないときだけ処理します。
    val optional: String? = "world"
    optional?.let { str ->
        println("値あり: ${str.uppercase()}")  // WORLD
    }

    val nothing: String? = null
    nothing?.let { str ->
        println("これは実行されません")
    }
    println("null の場合はスキップされます")

    // Nullable のリスト操作
    val items: List<String?> = listOf("a", null, "b", null, "c")
    val nonNull = items.filterNotNull()  // null を除去します。
    println(nonNull)  // [a, b, c]
}
概要

KotlinのNull安全はコンパイル時にNullPointerExceptionを防ぐ仕組みです。Nullable型(『String?』)と非Nullable型(『String』)を型システムで区別し、Nullable型への操作は必ず安全呼び出し(『?.』)か明示的なnullチェックが必要です。

JavaのコードをKotlinから呼び出す場合、Java側の型はすべて「プラットフォーム型」(nullかどうか不明)として扱われます。この場合は『?.』を使うか、JavaのAnnotationで明示するのが安全です。

nullのときのデフォルト値は?: エルビス演算子を、強制非null変換は!! 非 null アサーションを参照してください。

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