Introducción: ¿Por qué incluso los genios se equivocan en Java?
\n\nJava es un lenguaje estricto, pero gratificante. Sin embargo, los novatos a menudo tropiezan con los mismos rastrillos. Según las estadísticas de Stack Overflow, el 70% de las preguntas de los desarrolladores Java principiantes están relacionadas con cinco errores clásicos. En este artículo hemos recopilado los "Principales errores de desarrolladores Java principiantes: de la A a la Z", desde la confusión con == hasta el manejo incorrecto de la memoria.
Analizaremos cada problema con ejemplos, para que no solo recuerdes la regla, sino que entiendas su esencia. ¡Allá vamos!
\n\n1. Error n.º 1: "==" en lugar de equals() — un clásico del género
\n\nEl error más popular es comparar cadenas con ==. Los novatos piensan que funciona, y luego se sorprenden de que "Java" == "Java" dé false.
¿Por qué sucede esto?
\n- \n
==compara referencias a objetos (direcciones de memoria). \n equals()compara el contenido de los objetos. \n
Ejemplo:
\n\nString a = new String("Java");\nString b = new String("Java");\n\nSystem.out.println(a == b); // false — objetos diferentes en el heap\nSystem.out.println(a.equals(b)); // true — mismo contenido\n\n\nConsejo: Usa siempre .equals() para cadenas. Para primitivos (int, double), == funciona correctamente.
2. Error n.º 2: Olvidar el NullPointerException
\n\nNullPointerException (NPE) es el peor enemigo del junior. Ocurre con mayor frecuencia cuando llamas a un método sobre null.
Escenario típico:
\n\npublic String getName(User user) {\n return user.getName().toUpperCase(); // Si user == null — ¡NPE!\n}\n\n\n¿Cómo solucionarlo? Usa programación defensiva:
\n\npublic String getName(User user) {\n if (user == null) {\n return "Unknown";\n }\n return user.getName().toUpperCase();\n}\n\n\nO, a partir de Java 8, Optional:
public String getName(User user) {\n return Optional.ofNullable(user)\n .map(u -> u.getName().toUpperCase())\n .orElse("Unknown");\n}\n\n\n3. Error n.º 3: Ignorar excepciones
\n\nLos bloques catch vacíos son un antipatrón. El error no desaparece, simplemente lo ocultas.
Código malo:
\n\ntry {\n int result = 10 / 0;\n} catch (ArithmeticException e) {\n // No hacemos nada — el error se traga en silencio\n}\n\n\nCódigo bueno:
\n\ntry {\n int result = 10 / 0;\n} catch (ArithmeticException e) {\n System.err.println("Error de división por cero: " + e.getMessage());\n // O propagamos la excepción más arriba\n throw new RuntimeException("Error crítico", e);\n}\n\n\n4. Error n.º 4: Trabajo incorrecto con colecciones
\n\nLos novatos a menudo confunden List, Set y Map, y además olvidan los genéricos.
Errores típicos:
\n\n- \n
- Uso de tipos crudos (raw types) —
List list = new ArrayList();\n - Modificar una colección durante la iteración sin
Iterator.remove()\n - Reemplazar
HashMapporTreeMapsin entender la diferencia \n
Enfoque correcto:
\n\nList<String> names = new ArrayList<>();\nnames.add("Alice");\nnames.add("Bob");\n\n// Eliminación durante la iteración\nIterator<String> iterator = names.iterator();\nwhile (iterator.hasNext()) {\n String name = iterator.next();\n if (name.equals("Alice")) {\n iterator.remove(); // Seguro\n }\n}\n\n\n5. Error n.º 5: Fugas de memoria y cierre incorrecto de recursos
\n\n¿Olvidas cerrar Scanner, FileInputStream o una conexión a