1. Comparar objetos con==

El error favorito de los programadores novatos es comparar objetos (especialmente cadenas) usando el ==operador. Por 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");
}

Este código nunca mostrará "Las cadenas son iguales", porque la ifdeclaración compara referencias a dos objetos de cadena diferentes.

Aquí está la versión correcta del código:

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");
}


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

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


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

int[] array = new int[10];
array[0] = 1;
array[0] = 2;


4. 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. Con frecuencia usan nombres de una sola letra: a, b, i, etc. 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;
    }
  }
}

El código anterior no se compilará. 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 < count; i++)
      {
         a[i] = value;
      }
   }
}


5. Eliminar un elemento de la colección

Muy a menudo hay situaciones en las que un determinado elemento debe eliminarse de una colección. El código se ve más o menos así:

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 bucle for-each para recorrer simultáneamente los elementos de una colección y modificar esa colección.

Hay varias soluciones. Primero, puede 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 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 );


6. Colocar 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


7. 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. Tal 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 método principal 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();
  }
}


8. 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 ningún 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;
   }
}




Nombre de constructor no válido. El nombre del constructor 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


9. 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, 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 Meow
{
}


10. Omitir breaken una switchdeclaración

Y el último error para nosotros 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;
}