"¡Hola, amigo! Sigamos hablando de errores. Esta vez, exploraremos errores con los que el compilador no siempre te ayudará. Presta atención y aprenderás algo sobre ti".
"Estoy listo para escuchar, Diego. Espero que esto no sea demasiado vergonzoso para mí".
Comparar objetos con==
"Nuestra lista de los principales errores favoritos de los programadores novatos comienza con la comparación de objetos (especialmente cadenas) usando el ==
operador"
Ejemplo:
Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1 == s2)
{
System.out.println("The strings are equal");
}
"Lo he hecho con bastante frecuencia. Ahora puedo ver claramente que este código nunca mostrará "Las cadenas son iguales", porque la if
declaración compara referencias a dos objetos de cadena diferentes".
"Sí. Por eso la opción correcta sería:
Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1.equals(s2))
{
System.out.println("The strings are equal");
}
Cambiar un String
objeto
"Los programadores novatos a menudo olvidan que todos los objetos de la clase son inmutables y que cada método de la String
clase devuelve un nuevo objeto: el objeto actual nunca cambia".
"No fue hace tanto tiempo que aprendí lo que significa inmutable , pero creo que he hecho esto.
"Estoy bastante seguro de ello. Ejemplo:
String s = "Hello";
s.toUpperCase (); // Convert to uppercase
"Este código es muy similar al código correcto, pero no funcionará como se esperaba. El toUpperCase()
método no cambia el objeto en el que se llama. El código correcto se vería así:
String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase
"Exactamente. Lo he hecho, pero ni siquiera entendía realmente qué estaba mal. ¡Gracias por la aclaración!"
Olvidarse de inicializar objetos que son elementos de una matriz
"Otro error común es olvidarse de inicializar una variable de matriz. Ejemplo:
int[] array;
array[0] = 1;
array[0] = 2;
"Este código no funcionará: debe establecer explícitamente la variable de matriz igual a una referencia al objeto contenedor que almacenará los elementos de la matriz. Versión correcta:
int[] array = new int[10];
array[0] = 1;
array[0] = 2;
Usar una variable local en lugar de una variable de instancia.
"A los novatos no les gusta encontrar nombres largos y significativos para las variables".
"Eso es muy cierto. Para hacer las cosas rápidamente, a veces doy nombres a las variables como a
, b
y i
".
"No hagas eso. Eso es algo cruel cuando el código tiene varias variables como esa:
Pon el número 99 en 100 celdas de una matriz |
---|
|
"Es mucho más difícil cometer errores en el código con nombres propios. La versión correcta se ve así:
Pon el número 99 en 100 celdas de una matriz |
---|
|
Eliminar un elemento de la colección
"¿Ya has buscado en las colecciones?"
"Literalmente con un solo ojo".
"Si no sabe de lo que estoy hablando, tome nota para echar un vistazo en el futuro. Muy a menudo hay situaciones en las que un elemento determinado debe eliminarse de una colección. El código se ve más o menos como este:
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);
for (Integer value: list)
if (value < 0)
list.remove(value);
"Este código no funcionará, porque no puede usar un for-each
bucle para recorrer simultáneamente los elementos de una colección y modificar esa colección.
"Hay varias soluciones. Primero, puedes recorrer una colección y cambiar otra:
Solución 1 |
---|
|
"En segundo lugar, desde Java 8, las colecciones tienen un removeIf()
método al que se le puede pasar una regla (función lambda) que indica qué elementos eliminar. Ejemplo:
Solución 2 |
---|
|
Colocando varias clases con el public
modificador en un solo archivo
"Solo puede haber una clase pública en un archivo. Se pueden declarar más clases en un archivo, pero deben ser clases internas de una clase pública o no tener el public
modificador. Ejemplo:
Contenido del archivo Solution.java | Nota |
---|---|
|
Esto no está permitido: dos clases públicas en un solo archivo. |
|
Pero puedes hacer esto. La clase principal no es pública. |
|
Y puedes hacer esto. La clase principal es una clase anidada |
Llamar a métodos ordinarios (no estáticos) de una clase desde el main()
método estático
"A veces, los programadores novatos intentan acceder a variables y métodos no estáticos desde el main()
método u otros métodos estáticos. Ese código no funcionará, por supuesto.
public class Solution
{
public int n = 100;
public int[] createArray()
{
return new int[n];
}
public static void main(String[]args)
{
int[] array = createArray();
}
}
"El main
método solo puede referirse a métodos/variables estáticos. Bueno, o primero debe crear una instancia de la Solution
clase, y solo luego llamar a métodos no estáticos de ese objeto. Ejemplo:
Solución 1 | Solución 2 |
---|---|
|
|
Declarar un constructor como un método
"Otro error común es declarar incorrectamente un constructor de clase. El nombre de un constructor debe ser el mismo que el nombre de la clase, y un constructor no tiene un tipo de resultado. Los errores más comunes se ven así:
|
No debería haber un tipo de retorno aquí |
|
El nombre del constructor no es válido. Debe coincidir con el nombre de la clase. |
|
this Está perdido. La value variable se asignará a sí misma. |
|
Eso es todo correcto. |
Herencia incorrecta de interfaces.
"Los creadores de Java trataron de hacerlo muy parecido al inglés, por lo que eligieron diferentes palabras clave para ciertos conceptos relacionados.
Cuando una clase hereda una clase, debe usar la extends
palabra clave:
class Pet
{
}
class Cat extends Pet
{
}
"Cuando una clase hereda una interfaz o, más precisamente, la implementa, debe usar la implements
palabra clave:
interface Meow
{
}
class Cat implements Meow
{
}
"Cuando una interfaz hereda una interfaz, use la extends
palabra clave:
interface Meow
{
}
interface Voice extends Meov
{
}
Omitir break
en una switch
declaración
"Y el último error de hoy, pero no el último para los principiantes, es no incluir una break
declaración en una switch
declaración. Ejemplo:
Equivocado | Bien |
---|---|
|
|
"Sabes, Diego... A juzgar por el conjunto de errores que presentaste aquí, se siente como si hubieras estado leyendo mi diario personal... O me has estado viendo resolver tareas".
"¡Ja! No tengas dudas al respecto. He leído, rastreado y sigo haciéndolo. ¡Así que mantente alerta!"
"???"
"No te preocupes. Solo estoy bromeando. Mantente alerta y comete menos errores estúpidos".
GO TO FULL VERSION