---
title: "Soluciona java.lang.NullPointerException en Kotlin y Android a partir de su mensaje"
description: "En Kotlin, java.lang.NullPointerException viene de !!, un valor Java en un tipo no nulo, un cast de null o un llamador Java. La provocamos de 6 formas en JDK 17 y resolvemos cada mensaje."
canonical: "https://logbrew.co/es/errors/nullpointerexception"
last_updated: "2026-11-10"
---

# Soluciona java.lang.NullPointerException en Kotlin y Android a partir de su mensaje

En Kotlin, `java.lang.NullPointerException` viene de `!!`, un valor Java en un tipo no nulo, un cast de `null` o un llamador Java. La provocamos de 6 formas en JDK 17 y resolvemos cada mensaje.

Probado el 10 de noviembre de 2026 con Kotlin 2.4.0, OpenJDK 17.0.18 y logbrew-kotlin 0.2.3

Por [Furkan Erday](https://github.com/furkanerday). Furkan Erday es el fundador de LogBrew. Desarrolla LogBrew con Claude Code y Codex todos los días.

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

## Qué nombra cada mensaje de `NullPointerException`

| Qué hizo el código | `NullPointerException` | El mensaje nombra la causa |
| --- | --- | --- |
| `order!!` sobre un valor nulo | Sí | Sin mensaje |
| Un valor de Java en una `val` no nula | Sí | `getProperty(...) must not be null` |
| `null as String` | Sí | `null cannot be cast to non-null type` |
| `null` desde Java en un parámetro de Kotlin | Sí | `Parameter specified as non-null is null` |
| Una llamada a método sobre `null` en Java | Sí | `Cannot invoke "String.length()"` |
| Una `lateinit` leída antes de asignarla | `UninitializedPropertyAccessException` | `lateinit property keg has not been initialized` |

6 pruebas en JDK 17 con Kotlin 2.4. Una taza llena en la primera columna significa una `NullPointerException`, y en la segunda que su mensaje nombró la causa.

## Lee el mensaje y luego el primer frame

### Encuentra la línea en tu propio código

El primer frame de pila de tu propio paquete nombra el archivo y la línea. Cuando la traza de pila tiene una sección `Caused by:`, lee primero los frames que hay debajo. El mensaje te dice entonces cuál de los 5 casos siguientes tienes.

### Sin mensaje, por `!!` sobre un valor nulo

`!!` lanza una `NullPointerException` sin mensaje, así que un logger que imprime el mensaje tras dos puntos muestra `java.lang.NullPointerException: null`. La línea del primer frame contiene el `!!`.

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

Salida

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

### `must not be null` cuando un valor de Java entró en un tipo no nulo

Un método de Java devuelve un tipo de plataforma, y Kotlin lo comprueba solo cuando lo pones en una variable no nula. `getProperty(...)` nombra la llamada que devolvió `null`.

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

Salida

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

### `Parameter specified as non-null is null` cuando Java pasó `null` a Kotlin

Kotlin comprueba cada parámetro no nulo de una función pública al llamarla, así que un `null` desde Java falla en la primera línea de la función. El mensaje nombra la función y el parámetro.

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

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

Salida

```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` tras un cast de `null`

`as String` sobre un `null` lanza la excepción. `as? String` devuelve `null` en su lugar, y en nuestra prueba eso hizo, sin excepción.

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

Salida

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

### `Cannot invoke` por una llamada a método sobre `null` en código Java

Desde JDK 15, Java nombra el método y la variable. `<local0>` significa que la clase se compiló sin `-g`, así que falta el nombre de la variable. Compila con `javac -g` para verlo. En Android, el runtime escribe en su lugar `Attempt to invoke virtual method ... on a null object reference`.

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

Salida

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

## Soluciónalo en Kotlin y Android

### Sustituye `!!` por un valor por defecto o un fallo con nombre

`?:` da un valor por defecto o sale de la función. `requireNotNull()` con un mensaje falla al instante y dice qué faltaba, así que el primer frame y el mensaje apuntan los dos a la causa.

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

Salida

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

### Declara el tipo nullable en la frontera con Java

Dale a un valor de Java un tipo nullable y el compilador te obliga a tratar el `null` antes de usarlo. Anota tu propio Java con `@Nullable` y `@NonNull`, y Kotlin ve un tipo real en vez de un tipo de plataforma.

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

### Deja que el parser de JSON falle al parsear, no después

Un parser que construye objetos por reflexión puede meter `null` en una propiedad no nula de Kotlin, y la excepción aparece lejos del parseo. square/moshi#143 lo reportó en 2016. Se cerró en enero de 2018 con la respuesta de usar el adaptador de Kotlin, que rechaza un campo no nulo ausente.

### Usa `lateinit` solo para valores asignados antes del primer uso

Una propiedad `lateinit` leída antes de asignarla lanza `UninitializedPropertyAccessException`, no una `NullPointerException`. Comprueba antes `::keg.isInitialized`, o usa `by lazy` cuando puedas calcular el valor.

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

Taproom().keg.length
```

Salida

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

### Envía la excepción con su pila a LogBrew

`captureThrowable()` en el SDK de Kotlin envía el tipo de la excepción, sus frames de pila y su cadena de causas, y LogBrew agrupa las repeticiones en 1 incidencia. El mensaje se queda fuera salvo que pases `includeMessage = true`. En tu app, pasa `HttpTransport()` a `flush()` en vez del transporte de grabación.

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

Salida

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

## Lo que vimos al probarlo

Compilamos 1 archivo Kotlin y 1 archivo Java con Kotlin 2.4.0 en OpenJDK 17.0.18 y provocamos la excepción de 6 formas. 4 vinieron de código Kotlin, con `!!`, un valor de Java en una `val` no nula, `as String` sobre `null` y un `null` que Java pasó a un parámetro de Kotlin. La quinta fue una llamada a método sobre `null` en Java. La sexta, una lectura de `lateinit`, no era una `NullPointerException`.

Solo el caso de `!!` no tenía mensaje. Los otros 4 nombraron la llamada, el parámetro, el tipo o el método. El mensaje de Java decía `<local0>` para la variable porque compilamos sin `-g`.

`requireNotNull()` con un mensaje lanzó `IllegalArgumentException: keg is not set for tap 3` en la línea donde lo escribimos. `as? String` devolvió `null` sin excepción.

## Por qué Kotlin sigue lanzando NullPointerException

El compilador de Kotlin rechaza una llamada sobre un tipo nullable, así que el código Kotlin lanza una `NullPointerException` solo donde tú la pides. La documentación de null safety lista `!!`, un `throw` explícito, un `this` sin inicializar y la interoperabilidad con Java como las únicas causas. Un cast de `null` con `as` también la lanza, como muestra nuestra prueba.

Un valor de Java tiene un tipo de plataforma, escrito `String!` en los mensajes del compilador. Puedes ponerlo en un `String` o en un `String?`. En un `String`, Kotlin lo comprueba en la asignación y lanza `must not be null`, que es donde falló nuestra segunda prueba.

La JEP 358 añadió el mensaje `Cannot invoke ... because ... is null` a la JVM en JDK 14, y JDK 15 lo activó por defecto. El runtime de Android escribe su propio texto. google/gson#1778 lo muestra desde una app Android, como `Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference`.

## Lo que LogBrew registra

`captureThrowable()` envió 1 incidencia titulada `NullPointerException` con nivel `error`, con `exception.type` `NullPointerException`, el mecanismo `android.exception` y `handled: true`. La cadena de causas tenía 1 entrada para `java.lang.NullPointerException` con 7 frames de pila, cada uno con su archivo, línea, función y módulo. El primer frame era `main` en `Npe.kt` en la línea 58.

El mensaje estaba ausente, y la entrada de la cadena decía `messageState: "redacted"`. Con `includeMessage = true`, la incidencia llevaba `getProperty(...) must not be null` como mensaje. Con `includeStackTrace = true`, el campo de metadatos `throwableStackTrace` contenía el texto de la traza de pila sin el mensaje.

`flush()` respondió `statusCode=202, attempts=1` a través del transporte de grabación. El mismo cuerpo va a LogBrew cuando pasas `HttpTransport()`.

## Preguntas frecuentes

### ¿Qué es una NullPointerException?

La excepción que lanza la JVM cuando el código usa una referencia que contiene `null` en una llamada a método, una lectura de campo, un índice de array o un unboxing. Extiende `RuntimeException`, así que ninguna cláusula `throws` la nombra.

### ¿Por qué Kotlin lanza NullPointerException si tiene null safety?

Kotlin comprueba la nulabilidad en tiempo de compilación solo para tipos de Kotlin. `!!`, `as` sobre `null`, un valor de Java que pones en un tipo no nulo y un llamador Java que pasa `null` lanzan todos en tiempo de ejecución. Cada uno tiene su propio mensaje, listado arriba.

### ¿Qué significa `java.lang.NullPointerException: null`?

La excepción no tiene mensaje. El código que imprime el mensaje tras dos puntos escribe `null` ahí. En Kotlin, `!!` lanza exactamente esta excepción, así que busca `!!` en la línea del primer frame.

### ¿Qué significa Parameter specified as non-null is null?

Java, o la reflexión, pasó `null` a una función de Kotlin cuyo parámetro es no nulo. El mensaje nombra la función y el parámetro. Haz el parámetro nullable, o detén el `null` del lado del llamador.

### ¿Cómo soluciono una NullPointerException en Android?

Lee el frame bajo `Caused by:` que está en tu paquete y luego compara el mensaje con los casos de arriba. En Android, el runtime escribe `Attempt to invoke virtual method ... on a null object reference`, y el método que nombra es la llamada sobre el `null`.

### ¿NullPointerException es una excepción comprobada (checked)?

No. Extiende `RuntimeException`, así que el compilador no te obliga a capturarla. Soluciona la causa en vez de capturarla, porque un `null` que llega a una llamada a método es un bug en el código anterior.

## Ve cada NullPointerException con su pila

El SDK de Kotlin de LogBrew envía cada excepción con su tipo, sus frames de pila y su cadena de causas, y LogBrew agrupa las repeticiones en 1 incidencia. Empieza con el generoso plan gratuito, sin tarjeta.

[Empezar gratis](https://logbrew.co/es)

## Fuentes

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

## Más soluciones a errores

- [Soluciona el error Script error que oculta su mensaje, archivo y línea](https://logbrew.co/es/errors/script-error)
- [Soluciona el error Failed to fetch y distingue sus 3 causas](https://logbrew.co/es/errors/failed-to-fetch)
- [Errores que reproducimos, y cómo solucionar cada uno](https://logbrew.co/es/errors)
