Kotlinのダブルバン(!!)演算子とは何ですか?


177

Android StudioでJavaをKotlinに変換しています。インスタンス変数の後にダブルバンを取得します。ダブルバンとは何ですか?さらに重要なこととして、これはどこに文書化されていますか?

mMap!!.addMarker(MarkerOptions().position(london).title("Marker in London"))

回答:


205

これは危険なNULL可能タイプ(あるT?null非許容型への変換)( T)、 !!スローされますNullPointerException値がある場合null

これは、ヌルセーフティのKotlin手段とともにここに記載さています。


1
!!がステートメントの最後にある場合、それはどういう意味ですか?KotlinへIJの自動変換は私のためにそれをやったval price = sale.latest!!
ycomp

7
@ycomp、それはそれsale.latestが含むことができることを意味しますnull; 割り当てはsale.latestnullでない場合にのみ成功し、それ以外の場合はNPEをスローします。これにより、nullセーフが提供されますval price。その型はnull以外になります。kotlinlang.org/docs/reference/null-safety.htmlを
ホットキー

1
@hotkey:では、NPEを取得することの違いは何ですか-ここで、またはnullメソッドで最新のメソッドにアクセスするときですか?
Aada

2
@ Aada、NPEをデバッグすることは一般的な問題であり、値をnullに設定する行/実行パスを見つけるのに苦労します。このnull割り当ては、別のコンテキスト、クラス、または日でも発生する可能性があります。を使用!!すると、フェイルファストし、NPEの根本原因を特定できます。Javaに同様の機能(つまり、醜いifステートメントやassertイオンがない)があればいいのにと思います。
Cascader

82

これは、物事をより明確にするための例です。この機能があるとしましょう

fun main(args: Array<String>) {
    var email: String
    email = null
    println(email)
}

これにより、次のコンパイルエラーが発生します。

Null can not be a value of a non-null type String

これで、String型に疑問符を追加してnull可能にすることで、これを防ぐことができます。

だから私たちは

fun main(args: Array<String>) {
    var email: String?
    email = null
    println(email)
}

これにより、

null

emailの値がnullのときに関数が例外をスローするようにしたい場合は、emailの最後に2つの感嘆符を追加できます。このような

fun main(args: Array<String>) {
    var email: String?
    email = null
    println(email!!)
}

これはスローされます KotlinNullPointerException


5
では、なぜ「!!」を使用するのでしょうか。その変数がnullを持つとアプリが終了するため、安全ではありませんか?
Sam

3
@davidは、変数がnullではないことを100%確信していて(たとえば、明示的にチェックした場合)、null不可の変数が必要な場合にのみ使用できます
FMK

7
@FMKありがとうございます!ヌル可能型変数の値を非ヌル型変数に入れることを可能にするためにダブルバンが使用されていることを理解していますよね?
Sam

2
@davidはい、そうです。
FMK 2018

10

ダブルバン演算子は、ファンNullPointerException(または略してNPE)のファンにとって優れたオプションです。

ないヌルアサーションオペレータが !!どんな値を変換null以外のタイプと値がnullの場合、例外がスロー。

val nonNull = a!!.length

したがって、を書くa!!と、これはaStringここでは例として)の非ヌル値を返すか、aがヌルの場合はNPEをスローします。

NPEが必要な場合はそれを使用できますが、明示的に要求する必要があります。この演算子は、開発者が保証している場合に使用する必要があります値がnullになることはありません


2
初心者として尋ねる:値をnull以外の型に変換する理由は何ですか?
Wolf359

4
@ Wolf359これにより、その値がnullではないことを100%確認できます。(「それは、NPEをデバッグして値をnullに設定する行/実行パスを見つけるのに苦労を持っている共通の問題です。このヌル割り当ては異なるコンテキスト、クラス、あるいは日に起こることができる。!」Cascaderによって)
還元活性
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.