"¡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 ifdeclaració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 Stringobjeto

"Los programadores novatos a menudo olvidan que todos los objetos de la clase son inmutables y que cada método de la Stringclase 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, by 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
class Solution
{
  public static int a = 99;
  public static int i = 100;

  public static void main(String[] args)
  {
    int[] a = new int[i];
    for (int i = 0; i < 10; i++)
    {
      a[i] = a;
    }
  }
}

"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
class Solution
{
   public static int value = 99;
   public static int count = 100;

   public static void main(String[] args)
   {
      int[] a = new int[count];
      for (int i = 0; i < 10; i++)
      {
         a[i] = value;
      }
   }
}

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-eachbucle 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
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

ArrayList<Integer> copy = new ArrayList<Integer>(list);
for (Integer value: copy)
   if (value < 0)
      list.remove(value);

"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
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

list.removeIf( x-> x<0 );

Colocando varias clases con el publicmodificador 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 publicmodificador. Ejemplo:

Contenido del archivo Solution.java Nota
public class Solution
{
}
public class Main
{
}
Esto no está permitido: dos clases públicas en un solo archivo.
public class Solution
{
}
class Main
{
}
Pero puedes hacer esto. La clase principal no es pública.
public class Solution
{
  public static class Main
  {
  }
}
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 mainmétodo solo puede referirse a métodos/variables estáticos. Bueno, o primero debe crear una instancia de la Solutionclase, y solo luego llamar a métodos no estáticos de ese objeto. Ejemplo:

Solución 1 Solución 2
public class Solution
{
  public static int n = 100;

  public static int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    int[] array = createArray();
  }
}
public class Solution
{
  public int n = 100;

  public int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    Solution sol = new Solution();
    int[] array = sol.createArray();
  }
}

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í:

public class Person
{
   private String value;

   void Person(String value)
   {
      this.value = value;
   }
}
No debería haber un tipo de retorno aquí
public class Person
{
   private String value;

   constructor(String value)
   {
      this.value = value;
   }
}
El nombre del constructor no es válido. Debe coincidir con el nombre de la clase.
public class Person
{
   private String value;

   Person(String value)
   {
      value = value;
   }
}
this Está perdido. La valuevariable se asignará a sí misma.
public class Person
{
   private String value;

   Person(String value)
   {
      this.value = value;
   }
}
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 extendspalabra clave:

class Pet
{
}

class Cat extends Pet
{
}

"Cuando una clase hereda una interfaz o, más precisamente, la implementa, debe usar la implementspalabra clave:

interface Meow
{
}

class Cat implements Meow
{
}

"Cuando una interfaz hereda una interfaz, use la extendspalabra clave:

interface Meow
{
}

interface Voice extends Meov
{
}

Omitir breaken una switchdeclaración

"Y el último error de hoy, pero no el último para los principiantes, es no incluir una breakdeclaración en una switchdeclaración. Ejemplo:

Equivocado Bien
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
   case TUESDAY:
      System.out.println("Tuesday");
   case WEDNESDAY:
      System.out.println("Wednesday");
   case THURSDAY:
      System.out.println("Thursday");
   case FRIDAY:
      System.out.println("Friday");
   case SATURDAY:
      System.out.println("Saturday");
   case SUNDAY:
      System.out.println("Sunday");
}
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
      break;
   case TUESDAY:
      System.out.println("Tuesday");
      break;
   case WEDNESDAY:
      System.out.println("Wednesday");
      break;
   case THURSDAY:
      System.out.println("Thursday");
      break;
   case FRIDAY:
      System.out.println("Friday");
      break;
   case SATURDAY:
      System.out.println("Saturday");
      break;
   case SUNDAY:
      System.out.println("Sunday");
      break;
}

"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".