Evitar NullPointerExceptions
Patrones para escribir código seguro
Evitar NullPointerExceptions es una lección gratuita de Android Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Android Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Android Academy incluye 4 lecciones en total.
El objetivo: ningún NPE
Una NullPointerException, o NPE, ocurre cuando el código utiliza algo que en realidad es nulo. Kotlin está diseñado para que estos errores sean poco frecuentes.
Esta lección reúne las herramientas que ha aprendido y advierte sobre las pocas formas en que un NPE todavía puede aparecer.
El operador !!
La aserción de no nulidad !! indica al compilador que confíe en que un valor no es nulo. Si se equivoca, lanza un NPE.
Elimina la seguridad, por lo que debe utilizarla rara vez y solo cuando tenga la certeza.
fun main() {
val name: String? = "Ada"
println(name!!.length) // works, name is not null
}!! puede provocar un error
Si el valor realmente es nulo, !! lanza una NullPointerException exactamente en esa línea.
Esta es la principal forma de volver a introducir el problema que Kotlin evita. Evite !! cuando bastaría con una llamada segura o Elvis.
val name: String? = null
println(name!!.length)
// throws KotlinNullPointerExceptionPrefiera alternativas seguras
Casi cualquier uso de !! puede reescribirse con ?. y ?:. La versión segura no puede provocar un error.
Compare a continuación las formas arriesgada y segura.
// Risky:
val len1 = name!!.length
// Safe:
val len2 = name?.length ?: 0Valide al principio
Gestione los valores nulos en los límites del código y trabaje después con valores no nulos en el interior. Use Elvis con return o throw para rechazar de antemano las entradas ausentes.
Después de la comprobación, el valor se convierte automáticamente a un tipo no nulo mediante smart cast.
fun length(s: String?): Int {
val text = s ?: return 0
return text.length
}requireNotNull
Cuando un valor nulo indica realmente un error, requireNotNull lanza un error claro y devuelve el valor no nulo.
Es más descriptivo que !! porque permite añadir un mensaje.
fun start(config: String?) {
val c = requireNotNull(config) { "config missing" }
println(c.length)
}Tipos de plataforma de Java
Los valores procedentes de Java tienen una nulabilidad desconocida y se denominan tipos de plataforma. Kotlin no puede garantizar que no sean nulos.
Cuando utilice bibliotecas de Java, declare explícitamente el tipo esperado y gestione los valores nulos de forma defensiva.
// From Java: String maybe = obj.getName();
val name: String? = obj.name // be safe
println(name?.length ?: 0)El inconveniente de lateinit
Un lateinit var permite posponer la inicialización de una propiedad no nula. Sin embargo, utilizarla antes de asignarle un valor lanza una excepción.
Use lateinit solo cuando tenga la certeza de que el valor se establecerá antes de cualquier acceso.
lateinit var config: String
fun read() {
println(config.length)
// crashes if config was never set
}Valores predeterminados en lugar de nulos
A menudo puede evitar por completo la nulabilidad si elige un valor predeterminado adecuado. Una cadena vacía o una lista vacía suelen ser mejores que un valor nulo.
Menos tipos anulables significan menos posibilidades de que ocurra un NPE.
fun main() {
val tags: List<String> = emptyList()
println(tags.size) // 0, never null
}Una canalización segura
Este programa lee un valor opcional, lo transforma de forma segura y siempre produce un resultado. No usa !! ni provoca errores.
Este es el estilo que debe procurar utilizar en código real de Android.
fun main() {
val input: String? = null
val result = input?.trim()?.uppercase() ?: "N/A"
println(result) // prints: N/A
}Prácticas recomendadas
Prefiera tipos no nulos, gestione los valores nulos en los límites con Elvis y use ?.let para acciones opcionales. Reserve !! para los casos excepcionales en los que sea imposible que haya un valor nulo.
Si sigue estos hábitos, las NullPointerException pasarán a ser cosa del pasado.
val safe = data?.value ?: default
data?.let { handle(it) }Comprobación rápida
Compruebe su comprensión de cómo evitar las NullPointerException.
Resumen
En Kotlin, los NPE suelen proceder de !!, de los tipos de plataforma de Java o de valores lateinit sin inicializar. Evítelos dando prioridad a los tipos no nulos y a los operadores seguros.
Use ?., ?:, ?.let y validaciones como requireNotNull para mantener el código libre de errores. Ya ha completado los conceptos esenciales de la seguridad frente a nulos en Kotlin.
Preguntas frecuentes
¿La lección «Evitar NullPointerExceptions» es gratis?
Sí — el texto completo de «Evitar NullPointerExceptions» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Android Academy, actualiza a CoddyKit PRO. El curso de Android Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Evitar NullPointerExceptions»?
Patrones para escribir código seguro Practicas Android Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Android Academy?
No se requiere experiencia previa. Android Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Evitar NullPointerExceptions»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Android Academy?
Sí. Cada lección de Android Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Tipos anulables frente a no anulables
- Llamadas seguras y Elvis
- let, also y funciones de ámbito
- Evitar NullPointerExceptions