1. Comparando objetos com==

O erro favorito dos programadores novatos é comparar objetos (especialmente strings) usando o ==operador. Por exemplo:

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 exibirá "As strings são iguais", porque a ifinstrução compara referências a dois objetos de string diferentes.

Aqui está a versão correta do 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. Mudando um Stringobjeto

Os programadores novatos geralmente esquecem que todos os objetos da classe são imutáveis ​​e que todo método da Stringclasse retorna um novo objeto — o objeto atual nunca muda.

Exemplo:

String s = "Hello";
s.toUpperCase (); // Convert to uppercase

Este código é muito semelhante ao código correto, mas não funcionará como esperado. O toUpperCase()método não altera o objeto no qual é chamado. O código correto ficaria assim:

String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase


3. Esquecer de inicializar objetos que são elementos de um array

Outro erro comum é esquecer de inicializar uma variável de array. Exemplo:

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

Este código não funcionará: você precisa definir explicitamente a variável do array igual a uma referência ao objeto container que armazenará os elementos do array.

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


4. Usando uma variável local em vez de uma variável de instância.

Os novatos não gostam de criar nomes longos e significativos para as variáveis. Eles freqüentemente usam nomes de uma única letra: a, b, i, etc. Isso é uma coisa cruel de se fazer quando o código tem várias variáveis ​​como essa:

Coloque o número 99 em 100 células de uma 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;
    }
  }
}

O código acima não irá compilar. A versão correta é assim:

Coloque o número 99 em 100 células de uma 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. Removendo um item de coleção

Muitas vezes, há situações em que um determinado elemento precisa ser removido de uma coleção. O código é mais ou menos assim:

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 não funcionará, porque você não pode usar um loop for-each para percorrer simultaneamente os elementos de uma coleção e modificá-la.

Existem várias soluções. Primeiro, você pode percorrer uma coleção e alterar outra:

Solução 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);

Em segundo lugar, desde o Java 8, as coleções possuem um removeIf()método, para o qual você pode passar uma regra (função lambda) que indica quais elementos remover.

Exemplo:

Solução 2
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

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


6. Colocar várias classes com o publicmodificador em um único arquivo

Só pode haver uma classe pública em um arquivo. Mais classes podem ser declaradas em um arquivo, mas devem ser classes internas de uma classe pública ou não ter o publicmodificador. Exemplo:

Conteúdo do arquivo Solution.java Observação
public class Solution
{
}
public class Main
{
}
Isso não é permitido: duas classes públicas em um único arquivo.
public class Solution
{
}
class Main
{
}
Mas você pode fazer isso. A classe Main não é pública
public class Solution
{
  public static class Main
  {
  }
}
E você pode fazer isso. A classe Main é uma classe aninhada


7. Chamando métodos comuns (não estáticos) de uma classe a partir do main()método estático

Às vezes, programadores novatos tentam acessar variáveis ​​e métodos não estáticos do main()método ou de outros métodos estáticos. Esse código não funcionará, é claro.

public class Solution
{
   public int n = 100;
   public int[] createArray()
   {
      return new int[n];
   }

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

O método principal só pode se referir a métodos/variáveis ​​estáticos. Bem, ou ele deve primeiro criar uma instância da Solutionclasse e só então chamar os métodos não estáticos desse objeto. Exemplo:

Solução 1 Solução 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. Declarando um construtor como um método

Outro erro comum é declarar incorretamente um construtor de classe. O nome de um construtor deve ser igual ao nome da classe e um construtor não tem tipo de resultado. Os erros mais comuns são assim:

public class Person
{
   private String value;

   void Person(String value)
   {
      this.value = value;
   }
}




Não deveria haver um tipo de retorno aqui
public class Person
{
   private String value;

   constructor(String value)
   {
      this.value = value;
   }
}




Nome de construtor inválido. O nome do construtor deve corresponder ao nome da classe
public class Person
{
   private String value;

   Person(String value)
   {
      value = value;
   }
}






this está desaparecido. A valuevariável será atribuída a si mesma
public class Person
{
   private String value;

   Person(String value)
   {
      this.value = value;
   }
}




Isso é tudo correto


9. Herança incorreta de interfaces

Os criadores do Java tentaram torná-lo muito próximo do inglês, então escolheram palavras-chave diferentes para certos conceitos relacionados.

Quando uma classe herda uma classe, você deve usar a extendspalavra-chave:

class Pet
{
}

class Cat extends Pet
{
}

Quando uma classe herda uma interface, você precisa usar a implementspalavra-chave:

interface Meow
{
}

class Cat implements Meow
{
}

Quando uma interface herda uma interface, use a extendspalavra-chave:

interface Meow
{
}

interface Voice extends Meow
{
}


10. Omitir breakem uma switchdeclaração

E o último erro para nós hoje, mas não o último para iniciantes, é deixar de incluir uma breakdeclaração em uma switchdeclaração. Exemplo

Errado Certo
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;
}