!!演算子
強制的なNon-Null化とそのリスクを学びます
「!!演算子」は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フィードバックを取得できます。ローカル設定は不要です。