---
title: "Napraw java.lang.NullPointerException w Kotlinie i Androidzie po jego komunikacie"
description: "java.lang.NullPointerException w Kotlinie bierze się z !!, wartości z Javy w nienullowalnym typie, rzutowania null albo wywołania z Javy. 6 przypadków na JDK 17, z naprawą każdego komunikatu."
canonical: "https://logbrew.co/pl/errors/nullpointerexception"
last_updated: "2026-11-10"
---

# Napraw java.lang.NullPointerException w Kotlinie i Androidzie po jego komunikacie

`java.lang.NullPointerException` w Kotlinie bierze się z `!!`, wartości z Javy w nienullowalnym typie, rzutowania `null` albo wywołania z Javy. 6 przypadków na JDK 17, z naprawą każdego komunikatu.

Przetestowane 10 listopada 2026 z użyciem Kotlin 2.4.0, OpenJDK 17.0.18 i logbrew-kotlin 0.2.3

Autor [Furkan Erday](https://github.com/furkanerday). Furkan Erday jest założycielem LogBrew. Codziennie rozwija LogBrew z pomocą Claude Code i Codex.

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

## Co nazywa komunikat każdego `NullPointerException`

| Co zrobił kod | `NullPointerException` | Komunikat nazywa przyczynę |
| --- | --- | --- |
| `order!!` na wartości null | Tak | Brak komunikatu |
| Wartość z Javy w nienullowalnym `val` | Tak | `getProperty(...) must not be null` |
| `null as String` | Tak | `null cannot be cast to non-null type` |
| `null` z Javy w parametrze Kotlina | Tak | `Parameter specified as non-null is null` |
| Wywołanie metody na `null` w Javie | Tak | `Cannot invoke "String.length()"` |
| Odczyt `lateinit` przed ustawieniem | `UninitializedPropertyAccessException` | `lateinit property keg has not been initialized` |

6 testów na JDK 17 z Kotlin 2.4. Pełny kubek w pierwszej kolumnie oznacza `NullPointerException`, a w drugiej, że komunikat nazwał przyczynę.

## Przeczytaj komunikat, potem pierwszą ramkę

### Znajdź wiersz we własnym kodzie

Pierwsza ramka stosu z Twojego pakietu nazywa plik i wiersz. Gdy ślad ma sekcję `Caused by:`, najpierw przeczytaj ramki pod nią. Komunikat mówi potem, który z 5 przypadków poniżej masz.

### Brak komunikatu, z `!!` na wartości null

`!!` rzuca `NullPointerException` bez komunikatu, więc logger, który wypisuje komunikat po dwukropku, pokazuje `java.lang.NullPointerException: null`. Wiersz z pierwszej ramki zawiera `!!`.

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

Wynik

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

### `must not be null`, gdy wartość z Javy trafiła do nienullowalnego typu

Metoda Javy zwraca typ platformowy, a Kotlin sprawdza go dopiero, gdy wstawisz go do nienullowalnej zmiennej. `getProperty(...)` nazywa wywołanie, które zwróciło `null`.

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

Wynik

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

### `Parameter specified as non-null is null`, gdy Java przekazała `null` do Kotlina

Kotlin sprawdza każdy nienullowalny parametr publicznej funkcji przy jej wywołaniu, więc `null` z Javy zawodzi w pierwszym wierszu funkcji. Komunikat nazywa funkcję i parametr.

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

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

Wynik

```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` po rzutowaniu `null`

`as String` na `null` rzuca wyjątek. `as? String` zwraca zamiast tego `null`, i w naszym teście tak się stało, bez wyjątku.

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

Wynik

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

### `Cannot invoke` z wywołania metody na `null` w kodzie Javy

Od JDK 15 Java nazywa metodę i zmienną. `<local0>` oznacza, że klasę skompilowano bez `-g`, więc brakuje nazwy zmiennej. Skompiluj z `javac -g`, aby ją zobaczyć. Na Androidzie środowisko uruchomieniowe pisze zamiast tego `Attempt to invoke virtual method ... on a null object reference`.

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

Wynik

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

## Napraw to w Kotlinie i na Androidzie

### Zastąp `!!` wartością zapasową albo nazwanym błędem

`?:` daje wartość domyślną albo wychodzi z funkcji. `requireNotNull()` z komunikatem zawodzi od razu i mówi, czego brakowało, więc pierwsza ramka i komunikat razem wskazują przyczynę.

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

Wynik

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

### Zadeklaruj typ nullowalny na granicy z Javą

Daj wartości z Javy typ nullowalny, a kompilator każe Ci obsłużyć `null`, zanim jej użyjesz. Oznacz własny kod Javy adnotacjami `@Nullable` i `@NonNull`, a Kotlin zobaczy prawdziwy typ zamiast platformowego.

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

### Pozwól parserowi JSON zawieść przy parsowaniu, nie później

Parser, który buduje obiekty przez refleksję, może wstawić `null` do nienullowalnej właściwości Kotlina, a wyjątek pojawia się daleko od parsowania. Zgłoszenie square/moshi#143 opisało to w 2016. Zamknięto je w styczniu 2018 z odpowiedzią, by użyć adaptera Kotlina, który odrzuca brakujące nienullowalne pole.

### Używaj `lateinit` tylko dla wartości ustawianych przed pierwszym użyciem

Właściwość `lateinit` odczytana przed ustawieniem rzuca `UninitializedPropertyAccessException`, nie `NullPointerException`. Najpierw sprawdź `::keg.isInitialized` albo użyj `by lazy`, gdy możesz obliczyć wartość.

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

Taproom().keg.length
```

Wynik

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

### Wyślij wyjątek ze stosem do LogBrew

`captureThrowable()` w SDK Kotlin wysyła typ wyjątku, ramki stosu i łańcuch przyczyn, a LogBrew grupuje powtórzenia w 1 problem. Komunikat zostaje pominięty, chyba że przekażesz `includeMessage = true`. W swojej aplikacji przekaż do `flush()` `HttpTransport()` zamiast transportu nagrywającego.

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

Wynik

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

## Co zobaczyliśmy podczas testu

Skompilowaliśmy 1 plik Kotlina i 1 plik Javy z Kotlin 2.4.0 na OpenJDK 17.0.18 i wywołaliśmy wyjątek na 6 sposobów. Cztery pochodziły z kodu Kotlina, z `!!`, wartości z Javy w nienullowalnym `val`, `as String` na `null` i `null`, który Java przekazała do parametru Kotlina. Piąty to wywołanie metody na `null` w Javie. Szósty, odczyt `lateinit`, w ogóle nie był `NullPointerException`.

Tylko przypadek `!!` nie miał komunikatu. Pozostałe 4 nazwały wywołanie, parametr, typ albo metodę. Komunikat Javy podał `<local0>` jako zmienną, bo skompilowaliśmy bez `-g`.

`requireNotNull()` z komunikatem rzucił `IllegalArgumentException: keg is not set for tap 3` w wierszu, w którym go zapisaliśmy. `as? String` zwrócił `null` bez wyjątku.

## Dlaczego Kotlin nadal rzuca NullPointerException

Kompilator Kotlina odrzuca wywołanie na typie nullowalnym, więc kod Kotlina rzuca `NullPointerException` tylko tam, gdzie o to prosisz. Dokumentacja null safety wymienia `!!`, jawne `throw`, niezainicjowane `this` i współpracę z Javą jako jedyne przyczyny. Rzutowanie `null` przez `as` też go rzuca, jak pokazuje nasz test.

Wartość z Javy ma typ platformowy, zapisywany w komunikatach kompilatora jako `String!`. Możesz ją wstawić do `String` albo `String?`. W `String` Kotlin sprawdza ją przy przypisaniu i rzuca `must not be null`, i tam zawiódł nasz drugi test.

JEP 358 dodał komunikat `Cannot invoke ... because ... is null` do JVM w JDK 14, a JDK 15 włączył go domyślnie. Środowisko uruchomieniowe Androida pisze własny tekst. Zgłoszenie google/gson#1778 pokazuje go z aplikacji na Androida jako `Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference`.

## Co zapisuje LogBrew

`captureThrowable()` wysłał 1 problem o nazwie `NullPointerException` na poziomie `error`, z `exception.type` `NullPointerException`, mechanizmem `android.exception` i `handled: true`. Łańcuch przyczyn miał 1 wpis dla `java.lang.NullPointerException` z 7 ramkami stosu, każdą z plikiem, wierszem, funkcją i modułem. Pierwszą ramką był `main` w `Npe.kt` w wierszu 58.

Komunikatu nie było, a wpis łańcucha podał `messageState: "redacted"`. Z `includeMessage = true` problem niósł `getProperty(...) must not be null` jako komunikat. Z `includeStackTrace = true` pole metadanych `throwableStackTrace` zawierało tekst śladu bez komunikatu.

`flush()` odpowiedział `statusCode=202, attempts=1` przez transport nagrywający. To samo ciało trafia do LogBrew, gdy przekażesz `HttpTransport()`.

## Najczęściej zadawane pytania

### Czym jest NullPointerException?

Wyjątek, który JVM rzuca, gdy kod używa referencji trzymającej `null` w wywołaniu metody, odczycie pola, indeksie tablicy albo unboxingu. Rozszerza `RuntimeException`, więc żadna klauzula `throws` go nie wymienia.

### Dlaczego Kotlin rzuca NullPointerException, skoro ma null safety?

Kotlin sprawdza nullowalność w czasie kompilacji tylko dla typów Kotlina. `!!`, `as` na `null`, wartość z Javy wstawiona do nienullowalnego typu i wywołanie z Javy przekazujące `null` rzucają wyjątek w czasie działania. Każdy ma własny komunikat, wymieniony wyżej.

### Co oznacza `java.lang.NullPointerException: null`?

Wyjątek nie ma komunikatu. Kod, który wypisuje komunikat po dwukropku, pisze tam `null`. W Kotlinie `!!` rzuca dokładnie ten wyjątek, więc szukaj `!!` w wierszu z pierwszej ramki.

### Co oznacza Parameter specified as non-null is null?

Java albo refleksja przekazała `null` do funkcji Kotlina, której parametr jest nienullowalny. Komunikat nazywa funkcję i parametr. Zrób parametr nullowalnym albo zatrzymaj `null` po stronie wywołującego.

### Jak naprawić NullPointerException na Androidzie?

Przeczytaj ramkę pod `Caused by:`, która jest w Twoim pakiecie, potem dopasuj komunikat do przypadków wyżej. Na Androidzie środowisko uruchomieniowe pisze `Attempt to invoke virtual method ... on a null object reference`, a metoda, którą nazywa, to wywołanie na `null`.

### Czy NullPointerException to wyjątek kontrolowany?

Nie. Rozszerza `RuntimeException`, więc kompilator nie każe go łapać. Napraw przyczynę zamiast go łapać, bo `null`, który dociera do wywołania metody, to błąd w kodzie przed nim.

## Zobacz każdy NullPointerException ze stosem

SDK LogBrew dla Kotlina wysyła każdy wyjątek z typem, ramkami stosu i łańcuchem przyczyn, a LogBrew grupuje powtórzenia w 1 problem. Zacznij od hojnego darmowego planu, bez karty.

[Zacznij za darmo](https://logbrew.co/pl)

## Źródła

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

## Więcej napraw błędów

- [Napraw błąd Script error, który ukrywa komunikat, plik i wiersz](https://logbrew.co/pl/errors/script-error)
- [Napraw błąd Failed to fetch i odróżnij jego 3 przyczyny](https://logbrew.co/pl/errors/failed-to-fetch)
- [Błędy, które odtworzyliśmy, i jak naprawić każdy z nich](https://logbrew.co/pl/errors)
