---
title: "Atasi java.lang.NullPointerException di Kotlin dan Android dari pesannya"
description: "java.lang.NullPointerException di Kotlin datang dari !!, nilai Java di tipe non-null, cast null, atau pemanggil Java. Kami memicunya 6 cara di JDK 17 dan menunjukkan solusi tiap pesan."
canonical: "https://logbrew.co/id/errors/nullpointerexception"
last_updated: "2026-11-10"
---

# Atasi java.lang.NullPointerException di Kotlin dan Android dari pesannya

`java.lang.NullPointerException` di Kotlin datang dari `!!`, nilai Java di tipe non-null, cast `null`, atau pemanggil Java. Kami memicunya 6 cara di JDK 17 dan menunjukkan solusi tiap pesan.

Diuji pada 10 November 2026 dengan Kotlin 2.4.0, OpenJDK 17.0.18, dan logbrew-kotlin 0.2.3

Oleh [Furkan Erday](https://github.com/furkanerday). Furkan Erday adalah pendiri LogBrew. Setiap hari ia membangun LogBrew dengan Claude Code dan Codex.

Canonical: https://logbrew.co/id/errors/nullpointerexception

## Apa yang disebut tiap pesan `NullPointerException`

| Apa yang dilakukan kodenya | `NullPointerException` | Pesan menyebut penyebabnya |
| --- | --- | --- |
| `order!!` pada nilai null | Ya | Tanpa pesan |
| Nilai Java masuk ke `val` non-null | Ya | `getProperty(...) must not be null` |
| `null as String` | Ya | `null cannot be cast to non-null type` |
| `null` dari Java ke parameter Kotlin | Ya | `Parameter specified as non-null is null` |
| Pemanggilan metode pada `null` di Java | Ya | `Cannot invoke "String.length()"` |
| `lateinit` dibaca sebelum diisi | `UninitializedPropertyAccessException` | `lateinit property keg has not been initialized` |

6 pengujian di JDK 17 dengan Kotlin 2.4. Cangkir penuh di kolom pertama berarti ada `NullPointerException`, dan di kolom kedua berarti pesannya menyebut penyebabnya.

## Baca pesannya, lalu frame pertama

### Temukan baris di kode kamu sendiri

Frame stack pertama di package kamu sendiri menyebut file dan barisnya. Saat trace punya bagian `Caused by:`, baca frame di bawahnya dulu. Pesannya lalu memberi tahu kamu kasus mana dari 5 kasus di bawah yang kamu hadapi.

### Tanpa pesan, dari `!!` pada nilai null

`!!` melempar `NullPointerException` tanpa pesan, jadi logger yang mencetak pesan setelah titik dua menampilkan `java.lang.NullPointerException: null`. Baris di frame pertama memuat `!!` itu.

```bash
val order: String? = null
order!!.length
```

Output

```text
java.lang.NullPointerException
	at NpeKt.main$lambda$0(Npe.kt:27)
```

### `must not be null` saat nilai Java masuk ke tipe non-null

Metode Java mengembalikan platform type, dan Kotlin hanya memeriksanya saat kamu menaruhnya di variabel non-null. `getProperty(...)` menyebut pemanggilan yang mengembalikan `null`.

```bash
val beer: String = System.getProperty("taproom.beer")
```

Output

```text
java.lang.NullPointerException: getProperty(...) must not be null
	at NpeKt.main$lambda$1(Npe.kt:30)
```

### `Parameter specified as non-null is null` saat Java mengirim `null` ke Kotlin

Kotlin memeriksa tiap parameter non-null dari fungsi public saat fungsi dipanggil, jadi `null` dari Java gagal di baris pertama fungsi. Pesannya menyebut fungsi dan parameternya.

```bash
// Kotlin
fun greet(name: String): Int = name.length

// Java
NpeKt.greet(null);
```

Output

```text
java.lang.NullPointerException: Parameter specified as non-null is null: method NpeKt.greet, parameter name
	at NpeKt.greet(Npe.kt)
```

### `null cannot be cast to non-null type` setelah cast `null`

`as String` pada `null` melempar error. `as? String` mengembalikan `null` sebagai gantinya, dan dalam pengujian kami memang begitu, tanpa exception.

```bash
val value: Any? = null
value as String
```

Output

```text
java.lang.NullPointerException: null cannot be cast to non-null type kotlin.String
	at NpeKt.main$lambda$2(Npe.kt:35)
```

### `Cannot invoke` dari pemanggilan metode pada `null` di kode Java

Sejak JDK 15, Java menyebut metode dan variabelnya. `<local0>` berarti class dikompilasi tanpa `-g`, jadi nama variabelnya hilang. Kompilasi dengan `javac -g` untuk melihatnya. Di Android, runtime menulis `Attempt to invoke virtual method ... on a null object reference` sebagai gantinya.

```bash
String beer = null;
beer.length();
```

Output

```text
java.lang.NullPointerException: Cannot invoke "String.length()" because "<local0>" is null
	at Caller.lengthOfNull(Caller.java:10)
```

## Perbaiki di Kotlin dan Android

### Ganti `!!` dengan nilai cadangan atau kegagalan bernama

`?:` memberi nilai default atau keluar dari fungsi. `requireNotNull()` dengan pesan langsung gagal dan menyebut apa yang hilang, jadi frame pertama dan pesannya sama-sama menunjuk ke penyebabnya.

```bash
val order = orders[id] ?: return
val keg = requireNotNull(taps[id]) { "keg is not set for tap $id" }
```

Output

```text
java.lang.IllegalArgumentException: keg is not set for tap 3
	at NpeKt.main$lambda$6(Npe.kt:48)
```

### Deklarasikan tipe nullable di batas Java

Beri nilai dari Java tipe nullable, dan compiler memaksa kamu menangani `null` sebelum memakainya. Anotasi kode Java kamu sendiri dengan `@Nullable` dan `@NonNull`, dan Kotlin melihat tipe sungguhan, bukan platform type.

```bash
val beer: String? = System.getProperty("taproom.beer")
val name = beer ?: "house ale"
```

### Biarkan parser JSON gagal saat parse, bukan belakangan

Parser yang membangun objek lewat reflection bisa menaruh `null` di properti Kotlin non-null, dan exception-nya muncul jauh dari proses parse. square/moshi#143 melaporkan ini pada 2016. Laporan itu ditutup pada Januari 2018 dengan jawaban untuk memakai adapter Kotlin, yang menolak field non-null yang hilang.

### Pakai `lateinit` hanya untuk nilai yang diisi sebelum dipakai

Properti `lateinit` yang dibaca sebelum diisi melempar `UninitializedPropertyAccessException`, bukan `NullPointerException`. Periksa `::keg.isInitialized` dulu, atau pakai `by lazy` saat nilainya bisa dihitung.

```bash
class Taproom {
    lateinit var keg: String
}

Taproom().keg.length
```

Output

```text
kotlin.UninitializedPropertyAccessException: lateinit property keg has not been initialized
	at Taproom.getKeg(Npe.kt:6)
```

### Kirim exception beserta stack-nya ke LogBrew

`captureThrowable()` di SDK Kotlin mengirim tipe exception, frame stack-nya, dan rantai penyebabnya, dan LogBrew mengelompokkan pengulangan ke dalam 1 masalah. Pesannya tidak ikut kecuali kamu mengirim `includeMessage = true`. Di aplikasi kamu, berikan `HttpTransport()` ke `flush()` alih-alih transport perekam.

```bash
import co.logbrew.sdk.LogBrewAndroid
import co.logbrew.sdk.LogBrewClient
import co.logbrew.sdk.RecordingTransport

val transport = RecordingTransport.alwaysAccept()
val client = LogBrewClient.create(apiKey = System.getenv("LOGBREW_API_KEY"), sdkName = "logbrew-kotlin", sdkVersion = "0.2.3")
try {
    val beer: String = System.getProperty("taproom.beer")
    beer.length
} catch (e: NullPointerException) {
    LogBrewAndroid.captureThrowable(client, "evt_npe_1", "2026-11-10T09:00:00Z", e)
}
println(client.flush(transport))
```

Output

```text
TransportResponse(statusCode=202, attempts=1)
```

## Hasil pengujian kami

Kami mengompilasi 1 file Kotlin dan 1 file Java dengan Kotlin 2.4.0 di OpenJDK 17.0.18 dan memicu exception dengan 6 cara. 4 datang dari kode Kotlin, dengan `!!`, nilai Java di `val` non-null, `as String` pada `null`, dan `null` yang dikirim Java ke parameter Kotlin. Yang kelima adalah pemanggilan metode pada `null` di Java. Yang keenam, pembacaan `lateinit`, sama sekali bukan `NullPointerException`.

Hanya kasus `!!` yang tanpa pesan. 4 lainnya menyebut pemanggilan, parameter, tipe, atau metodenya. Pesan Java menulis `<local0>` untuk variabelnya karena kami mengompilasi tanpa `-g`.

`requireNotNull()` dengan pesan melempar `IllegalArgumentException: keg is not set for tap 3` di baris tempat kami menulisnya. `as? String` mengembalikan `null` tanpa exception.

## Kenapa Kotlin masih melempar NullPointerException

Compiler Kotlin menolak pemanggilan pada tipe nullable, jadi kode Kotlin hanya melempar `NullPointerException` di tempat kamu memintanya. Dokumentasi null safety menyebut `!!`, `throw` eksplisit, `this` yang belum diinisialisasi, dan interoperabilitas Java sebagai satu-satunya penyebab. Cast `null` dengan `as` juga melemparnya, seperti yang ditunjukkan pengujian kami.

Nilai dari Java punya platform type, ditulis `String!` di pesan compiler. Kamu bisa menaruhnya di `String` atau `String?`. Di `String`, Kotlin memeriksanya saat penugasan dan melempar `must not be null`, dan di situlah pengujian kedua kami gagal.

JEP 358 menambahkan pesan `Cannot invoke ... because ... is null` ke JVM di JDK 14, dan JDK 15 mengaktifkannya secara default. Runtime Android menulis teksnya sendiri. google/gson#1778 menunjukkannya dari aplikasi Android, sebagai `Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference`.

## Apa yang direkam LogBrew

`captureThrowable()` mengirim 1 masalah berjudul `NullPointerException` di level `error`, dengan `exception.type` `NullPointerException`, mekanisme `android.exception`, dan `handled: true`. Rantai penyebabnya memuat 1 entri untuk `java.lang.NullPointerException` dengan 7 frame stack, masing-masing dengan file, baris, fungsi, dan modulnya. Frame pertamanya adalah `main` di `Npe.kt` pada baris 58.

Pesannya tidak ada, dan entri rantai itu menyebut `messageState: "redacted"`. Dengan `includeMessage = true`, masalah itu membawa `getProperty(...) must not be null` sebagai pesannya. Dengan `includeStackTrace = true`, field metadata `throwableStackTrace` memuat teks trace tanpa pesannya.

`flush()` menjawab `statusCode=202, attempts=1` lewat transport perekam. Body yang sama dikirim ke LogBrew saat kamu memberikan `HttpTransport()`.

## Pertanyaan yang sering diajukan

### Apa itu NullPointerException?

Exception yang dilempar JVM saat kode memakai referensi yang berisi `null` dalam pemanggilan metode, pembacaan field, indeks array, atau unboxing. Ia mewarisi `RuntimeException`, jadi tidak ada klausa `throws` yang menyebutnya.

### Kenapa Kotlin melempar NullPointerException padahal punya null safety?

Kotlin memeriksa nullability saat kompilasi hanya untuk tipe Kotlin. `!!`, `as` pada `null`, nilai Java yang kamu taruh di tipe non-null, dan pemanggil Java yang mengirim `null` semuanya melempar saat runtime. Masing-masing punya pesannya sendiri, tercantum di atas.

### Apa arti `java.lang.NullPointerException: null`?

Exception-nya tidak punya pesan. Kode yang mencetak pesan setelah titik dua menulis `null` di sana. Di Kotlin, `!!` melempar persis exception ini, jadi cari `!!` di baris pada frame pertama.

### Apa arti Parameter specified as non-null is null?

Java, atau reflection, mengirim `null` ke fungsi Kotlin yang parameternya non-null. Pesannya menyebut fungsi dan parameternya. Jadikan parameter itu nullable, atau hentikan `null` di sisi pemanggil.

### Bagaimana cara mengatasi NullPointerException di Android?

Baca frame di bawah `Caused by:` yang ada di package kamu, lalu cocokkan pesannya dengan kasus di atas. Di Android, runtime menulis `Attempt to invoke virtual method ... on a null object reference`, dan metode yang disebutnya adalah pemanggilan pada `null` itu.

### Apakah NullPointerException termasuk checked exception?

Tidak. Ia mewarisi `RuntimeException`, jadi compiler tidak memaksa kamu menangkapnya. Perbaiki penyebabnya alih-alih menangkapnya, karena `null` yang sampai ke pemanggilan metode adalah bug di kode sebelumnya.

## Lihat setiap NullPointerException beserta stack-nya

SDK Kotlin LogBrew mengirim tiap exception dengan tipe, frame stack, dan rantai penyebabnya, dan LogBrew mengelompokkan pengulangan ke dalam 1 masalah. Mulai dengan paket gratis yang lega, tanpa perlu kartu.

[Mulai gratis](https://logbrew.co/id)

## Sumber

- [Kotlin docs, Null safety](https://kotlinlang.org/docs/null-safety.html)
- [Kotlin docs, Null-safety and platform types](https://kotlinlang.org/docs/java-interop.html#null-safety-and-platform-types)
- [JEP 358, Helpful NullPointerExceptions](https://openjdk.org/jeps/358)
- [square/moshi#143](https://github.com/square/moshi/issues/143)
- [google/gson#1778](https://github.com/google/gson/issues/1778)

## Solusi error lainnya

- [Atasi script error yang menyembunyikan pesan, file, dan barisnya](https://logbrew.co/id/errors/script-error)
- [Atasi error Failed to fetch dan bedakan 3 penyebabnya](https://logbrew.co/id/errors/failed-to-fetch)
- [Error yang kami reproduksi, dan cara mengatasinya](https://logbrew.co/id/errors)
