1. 概要

Kotlinでは、nullabilityは、NullPointerExceptionを回避するのに役立つ型システム機能です。

このクイックチュートリアルでは、null以外のアサーション( !! )演算子を紹介し、それをいつどのように使用するかを確認します。

2. Not-Nullアサーション

Kotlinの各型には、1つのnull許容形式と別の非null許容形式があります。たとえば、Int型はnull以外の32ビット整数を保持できます。 同じ値に加えて、 Int?タイプはnull値も保持できます。

Kotlinには、null許容データ型を安全に処理するを容易にするための多くのオプションが用意されています。

ただし、null許容型をnull許容型に強制的に変換する必要がある場合があります。 結局のところ、Kotlinのnullではないアサーション演算子!!はまさにそれを実行します。

val answer: String? = "42"
assertEquals(42, answer!!.toInt())

確かに答え nullではない場合は、 !! オペレーター。 そうしないと、toIntメソッドを呼び出すことができませんでした。

この演算子をnull値に適用すると、Kotlinはjava.lang.NullPointerExceptionのインスタンスをスローします。

@Test
fun givenNullableValue_WhenIsNull_ThenShouldThrow() {
    assertFailsWith<NullPointerException> {
        val noAnswer: String? = null
            noAnswer!!
    }
}

また、応募すれば !! null許容型ではない場合でも、コンパイラーはコードをコンパイルします。

val answer = "42"
answer!!.toInt()

ただし、文句を言って、警告メッセージを表示します。

Unnecessary non-null assertion (!!) on a non-null receiver of type String

3. ユースケース

ほとんどの場合、私たちは適用すべきではありません!! 純粋なKotlinコードの演算子。 nullセーフ呼び出しや、 エルビス演算子

ただし、一部のサードパーティライブラリを操作している間は、とにかくこの演算子を使用する必要がある場合があります。 たとえば、SpringDTOでBeanValidationアノテーションを使用しているとします。

data class NewUserDto(
    @get:NotNull
    val username: String? = null
)

Springは検証ルールをリクエストデータに自動的に適用します。 したがって、検証が行われた後、ユーザー名nullではないことを確認します。

val request: NewUserDto = // from controller
userService.registerUser(request.username!!)

コンテキストから値がnullでないことはわかっていますが、Kotlinコンパイラにはこの情報を推測する方法がありません。 したがって、ここでは!!演算子を使用する必要があります。

4. 結論

このクイックチュートリアルでは、Kotlinのnull可能性のもう1つの側面である非nullアサーション演算子について理解しました。

いつものように、すべてのサンプルはGitHubから入手できます。