Android Academy · レッスン

NullPointerExceptionを防ぐ

安全なコードのパターンを学びます。

レッスン 4/413 ステップ

「NullPointerExceptionを防ぐ」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。

目標:NPE をなくす

NullPointerException(NPE)は、実際には null であるものをコードが使用したときに発生します。Kotlin は、この例外がめったに発生しないように設計されています。

このレッスンでは、これまでに学んだツールを組み合わせ、NPE が発生する可能性が残るわずかなケースについても説明します。

!! 演算子

not-null アサーションである !! は、値が null でないとコンパイラーに伝えます。実際に null だった場合は、NPE をスローします。

安全性を取り除く演算子なので、確実に null でないと判断できる場合にだけ、まれに使用してください。

fun main() {
    val name: String? = "Ada"
    println(name!!.length)  // works, name is not null
}

!! はクラッシュを引き起こす

値が実際に null の場合、!! はその行で NullPointerException をスローします。

これは、Kotlin が防いでいる問題を再び引き起こす主な方法です。セーフコールや Elvis 演算子で対応できる場合は、!! を避けてください。

val name: String? = null
println(name!!.length)
// throws KotlinNullPointerException

安全な代替手段を優先する

!! のほとんどの使用箇所は、?. と ?: を使って書き換えられます。安全な書き方ではクラッシュしません。

以下で、危険な形式と安全な形式を比較します。

// Risky:
val len1 = name!!.length
// Safe:
val len2 = name?.length ?: 0

早い段階で検証する

コードの境界で null を処理し、その後は内部で null でない値を扱います。Elvis 演算子と return または throw を使って、入力がない場合は早い段階で拒否します。

ガードの後では、値はスマートキャストによって null でない型として扱われます。

fun length(s: String?): Int {
    val text = s ?: return 0
    return text.length
}

requireNotNull

null が本当にバグを意味する場合、requireNotNull は分かりやすいエラーをスローし、null でない値を返します。

メッセージを追加できるため、!! よりも説明的です。

fun start(config: String?) {
    val c = requireNotNull(config) { "config missing" }
    println(c.length)
}

Java 由来のプラットフォーム型

Java から渡される値は null 許容性が不明で、プラットフォーム型と呼ばれます。Kotlin は、それらが null でないことを保証できません。

Java ライブラリを使用するときは、想定する型を明示的に宣言し、null を考慮して処理してください。

// From Java: String maybe = obj.getName();
val name: String? = obj.name  // be safe
println(name?.length ?: 0)

lateinit の落とし穴

lateinit var を使うと、null でないプロパティの初期化を後回しにできます。ただし、代入前に使用すると例外がスローされます。

どのアクセスよりも前に値が設定されることを確信できる場合にだけ、lateinit を使用してください。

lateinit var config: String
fun read() {
    println(config.length)
    // crashes if config was never set
}

null ではなくデフォルト値を使う

多くの場合、適切なデフォルト値を選ぶことで null 許容性そのものを避けられます。空文字列や空のリストは、null より適していることがよくあります。

nullable 型が少なければ、NPE が発生する可能性も減ります。

fun main() {
    val tags: List<String> = emptyList()
    println(tags.size)  // 0, never null
}

安全なパイプライン

このプログラムはオプションの値を読み取り、安全に変換して、必ず結果を生成します。!! もクラッシュもありません。

実際の Android コードでも目指すべきスタイルです。

fun main() {
    val input: String? = null
    val result = input?.trim()?.uppercase() ?: "N/A"
    println(result)  // prints: N/A
}

ベストプラクティス

null でない型を優先し、境界では Elvis 演算子で null を処理し、オプションの処理には ?.let を使用してください。!! は null があり得ないまれなケースに限って使用します。

これらの習慣に従えば、NullPointerException は過去のものになります。

val safe = data?.value ?: default
data?.let { handle(it) }

理解度チェック

NullPointerException の回避について、理解度を確認しましょう。

まとめ

Kotlin で NPE が発生する主な原因は、!!、Java 由来のプラットフォーム型、初期化されていない lateinit の値です。null でない型と安全な演算子を優先して、これらを避けてください。

?.、?:、?.let、requireNotNull などの検証を使用して、クラッシュしないコードを保ちます。これで Kotlin の null 安全性の基本をすべて学び終えました。

無料で開始

AI チューターと学ぶ Kotlin — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
36
レッスン
152

よくある質問

「NullPointerExceptionを防ぐ」レッスンは無料ですか?

はい。「NullPointerExceptionを防ぐ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。

「NullPointerExceptionを防ぐ」で何を学びますか?

安全なコードのパターンを学びます。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「NullPointerExceptionを防ぐ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Nullable型とNon-Null型
  2. 安全呼び出しとElvis
  3. let、also、スコープ関数
  4. NullPointerExceptionを防ぐ
← Android Academyに戻る