---
title: "java.lang.NullPointerException in Kotlin en Android oplossen via de melding"
description: "java.lang.NullPointerException in Kotlin komt van !!, een Java-waarde in een non-null type, een cast van null of een Java-aanroeper. 6 gevallen op JDK 17, met de oplossing per melding."
canonical: "https://logbrew.co/nl/errors/nullpointerexception"
last_updated: "2026-11-10"
---

# java.lang.NullPointerException in Kotlin en Android oplossen via de melding

`java.lang.NullPointerException` in Kotlin komt van `!!`, een Java-waarde in een non-null type, een cast van `null` of een Java-aanroeper. 6 gevallen op JDK 17, met de oplossing per melding.

Getest op 10 november 2026 met Kotlin 2.4.0, OpenJDK 17.0.18 en logbrew-kotlin 0.2.3

Door [Furkan Erday](https://github.com/furkanerday). Furkan Erday is de oprichter van LogBrew. Hij bouwt LogBrew elke dag met Claude Code en Codex.

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

## Wat elke `NullPointerException`-melding noemt

| Wat de code deed | `NullPointerException` | Melding noemt de oorzaak |
| --- | --- | --- |
| `order!!` op een null-waarde | Ja | Geen melding |
| Een Java-waarde in een non-null `val` | Ja | `getProperty(...) must not be null` |
| `null as String` | Ja | `null cannot be cast to non-null type` |
| `null` uit Java in een Kotlin-parameter | Ja | `Parameter specified as non-null is null` |
| Een methodeaanroep op `null` in Java | Ja | `Cannot invoke "String.length()"` |
| Een `lateinit` gelezen voordat hij is gezet | `UninitializedPropertyAccessException` | `lateinit property keg has not been initialized` |

6 runs op JDK 17 met Kotlin 2.4. Een volle mok in de eerste kolom betekent een `NullPointerException`, in de tweede dat de melding de oorzaak noemde.

## Lees de melding, dan het eerste frame

### Zoek de regel in je eigen code

Het eerste stackframe in je eigen package noemt het bestand en de regel. Als de trace een `Caused by:`-sectie heeft, lees dan eerst de frames daaronder. De melding zegt je dan welk van de 5 gevallen hieronder je hebt.

### Geen melding, van `!!` op een null-waarde

`!!` gooit een `NullPointerException` zonder melding, dus een logger die de melding na een dubbele punt print, toont `java.lang.NullPointerException: null`. De regel in het eerste frame bevat de `!!`.

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

Uitvoer

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

### `must not be null` als een Java-waarde in een non-null type kwam

Een Java-methode geeft een platform type terug, en Kotlin controleert het pas als je het in een non-null variabele zet. `getProperty(...)` noemt de aanroep die `null` teruggaf.

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

Uitvoer

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

### `Parameter specified as non-null is null` als Java `null` aan Kotlin doorgaf

Kotlin controleert elke non-null parameter van een publieke functie bij de aanroep, dus een `null` uit Java faalt op de eerste regel van de functie. De melding noemt de functie en de parameter.

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

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

Uitvoer

```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` na een cast van `null`

`as String` op een `null` gooit. `as? String` geeft in plaats daarvan `null` terug, en in onze run deed hij dat, zonder exception.

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

Uitvoer

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

### `Cannot invoke` van een methodeaanroep op `null` in Java-code

Sinds JDK 15 noemt Java de methode en de variabele. `<local0>` betekent dat de class zonder `-g` is gecompileerd, dus de naam van de variabele ontbreekt. Compileer met `javac -g` om hem te zien. Op Android schrijft de runtime in plaats daarvan `Attempt to invoke virtual method ... on a null object reference`.

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

Uitvoer

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

## Los het op in Kotlin en Android

### Vervang `!!` door een fallback of een benoemde fout

`?:` geeft een standaardwaarde of verlaat de functie. `requireNotNull()` met een melding faalt meteen en zegt wat er ontbrak, dus het eerste frame en de melding wijzen allebei naar de oorzaak.

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

Uitvoer

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

### Declareer het type nullable op de Java-grens

Geef een waarde uit Java een nullable type, dan dwingt de compiler je om `null` af te handelen voordat je hem gebruikt. Annoteer je eigen Java met `@Nullable` en `@NonNull`, dan ziet Kotlin een echt type in plaats van een platform type.

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

### Laat een JSON-parser falen bij het parsen, niet later

Een parser die objecten via reflection bouwt, kan `null` in een non-null Kotlin-property zetten, en de exception verschijnt ver van het parsen. square/moshi#143 meldde dit in 2016. Het ging dicht in januari 2018 met het antwoord om de Kotlin-adapter te gebruiken, die een ontbrekend non-null veld afwijst.

### Gebruik `lateinit` alleen voor waarden die vóór het eerste gebruik gezet zijn

Een `lateinit`-property die gelezen wordt voordat hij gezet is, gooit `UninitializedPropertyAccessException`, geen `NullPointerException`. Controleer eerst `::keg.isInitialized`, of gebruik `by lazy` als je de waarde kunt berekenen.

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

Taproom().keg.length
```

Uitvoer

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

### Stuur de exception met zijn stack naar LogBrew

`captureThrowable()` in de Kotlin-SDK stuurt het exceptiontype, de stackframes en de oorzaakketen, en LogBrew groepeert herhalingen in 1 issue. De melding blijft weg tenzij je `includeMessage = true` meegeeft. In je app geef je `HttpTransport()` aan `flush()` in plaats van de opnemende transport.

```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))
```

Uitvoer

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

## Wat we zagen in onze test

We compileerden 1 Kotlin-bestand en 1 Java-bestand met Kotlin 2.4.0 op OpenJDK 17.0.18 en lokten de exception op 6 manieren uit. Vier kwamen uit Kotlin-code, met `!!`, een Java-waarde in een non-null `val`, `as String` op `null`, en een `null` die Java aan een Kotlin-parameter doorgaf. De vijfde was een methodeaanroep op `null` in Java. De zesde, het lezen van een `lateinit`, was helemaal geen `NullPointerException`.

Alleen het geval met `!!` had geen melding. De andere 4 noemden de aanroep, de parameter, het type of de methode. De Java-melding zei `<local0>` voor de variabele omdat we zonder `-g` compileerden.

`requireNotNull()` met een melding gooide `IllegalArgumentException: keg is not set for tap 3` op de regel waar we hem schreven. `as? String` gaf `null` terug zonder exception.

## Waarom Kotlin toch NullPointerException gooit

De Kotlin-compiler weigert een aanroep op een nullable type, dus Kotlin-code gooit alleen een `NullPointerException` waar je erom vraagt. De documentatie over null safety noemt `!!`, een expliciete `throw`, een niet-geïnitialiseerde `this` en Java-interoperabiliteit als enige oorzaken. Een cast van `null` met `as` gooit er ook een, zoals onze run laat zien.

Een waarde uit Java heeft een platform type, in compilermeldingen geschreven als `String!`. Je kunt hem in een `String` of een `String?` zetten. In een `String` controleert Kotlin hem bij de toewijzing en gooit `must not be null`, en daar faalde onze tweede run.

JEP 358 voegde de melding `Cannot invoke ... because ... is null` in JDK 14 toe aan de JVM, en JDK 15 zette hem standaard aan. De runtime van Android schrijft zijn eigen tekst. google/gson#1778 laat hem zien uit een Android-app, als `Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference`.

## Wat LogBrew vastlegt

`captureThrowable()` stuurde 1 issue met de titel `NullPointerException` op niveau `error`, met `exception.type` `NullPointerException`, het mechanisme `android.exception` en `handled: true`. De oorzaakketen bevatte 1 entry voor `java.lang.NullPointerException` met 7 stackframes, elk met bestand, regel, functie en module. Het eerste frame was `main` in `Npe.kt` op regel 58.

De melding ontbrak, en de entry in de keten zei `messageState: "redacted"`. Met `includeMessage = true` droeg het issue `getProperty(...) must not be null` als melding. Met `includeStackTrace = true` bevatte het metadataveld `throwableStackTrace` de tracetekst zonder de melding.

`flush()` antwoordde `statusCode=202, attempts=1` via de opnemende transport. Dezelfde body gaat naar LogBrew als je `HttpTransport()` meegeeft.

## Veelgestelde vragen

### Wat is een NullPointerException?

De exception die de JVM gooit als code een referentie met `null` gebruikt in een methodeaanroep, bij het lezen van een veld, een array-index of een unboxing. Hij erft van `RuntimeException`, dus geen enkele `throws`-clausule noemt hem.

### Waarom gooit Kotlin een NullPointerException als het null safety heeft?

Kotlin controleert nullability alleen voor Kotlin-types, tijdens het compileren. `!!`, `as` op `null`, een Java-waarde die je in een non-null type zet en een Java-aanroeper die `null` doorgeeft, gooien allemaal tijdens runtime. Elk heeft zijn eigen melding, hierboven op een rij.

### Wat betekent `java.lang.NullPointerException: null`?

De exception heeft geen melding. Code die de melding na een dubbele punt print, schrijft daar `null`. In Kotlin gooit `!!` precies deze exception, dus zoek naar `!!` op de regel in het eerste frame.

### Wat betekent Parameter specified as non-null is null?

Java, of reflection, gaf `null` door aan een Kotlin-functie waarvan de parameter non-null is. De melding noemt de functie en de parameter. Maak de parameter nullable, of stop de `null` aan de kant van de aanroeper.

### Hoe los ik een NullPointerException op in Android?

Lees het frame onder `Caused by:` dat in je package zit, en match de melding dan met de gevallen hierboven. Op Android schrijft de runtime `Attempt to invoke virtual method ... on a null object reference`, en de methode die hij noemt is de aanroep op de `null`.

### Is NullPointerException een checked exception?

Nee. Hij erft van `RuntimeException`, dus de compiler dwingt je niet om hem te vangen. Los de oorzaak op in plaats van hem te vangen, want een `null` die een methodeaanroep bereikt is een bug in de code ervoor.

## Zie elke NullPointerException met zijn stack

De LogBrew Kotlin-SDK stuurt elke exception met zijn type, stackframes en oorzaakketen, en LogBrew groepeert herhalingen in 1 issue. Begin met het ruime gratis abonnement, zonder creditcard.

[Gratis beginnen](https://logbrew.co/nl)

## Bronnen

- [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)

## Meer fouten oplossen

- [De Script error oplossen die zijn melding, bestand en regel verbergt](https://logbrew.co/nl/errors/script-error)
- [De fout Failed to fetch oplossen en de 3 oorzaken uit elkaar houden](https://logbrew.co/nl/errors/failed-to-fetch)
- [Fouten die we reproduceerden, en hoe je elke oplost](https://logbrew.co/nl/errors)
