"Olá, amigo! Vamos continuar a falar sobre erros. Desta vez, vamos explorar erros que o compilador nem sempre irá ajudá-lo. Preste atenção e você aprenderá algo sobre você."

"Estou pronto para ouvir, Diego. Espero que isso não seja muito embaraçoso para mim."

Comparando objetos com==

"Nossa lista dos principais erros favoritos do programador novato começa com a comparação de objetos (especialmente strings) usando o ==operador"

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

"Eu fiz isso com bastante frequência. Agora posso ver claramente que esse código nunca exibirá "As strings são iguais", porque a ifinstrução compara referências a dois objetos de string diferentes."

"Sim. É por isso que a opção correta seria:

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

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

"Não faz muito tempo que aprendi o que significa imutável , mas acho que fiz isso.

"Tenho quase certeza disso. 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

"Exatamente. Já fiz isso, mas nem entendi direito o que estava errado. Obrigado pelo esclarecimento!"

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. Versão correta:

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

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

"Isso é verdade. Para fazer as coisas rapidamente, às vezes dou nomes de variáveis ​​como a, be i."

"Não faça isso. 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;
    }
  }
}

"É muito mais difícil cometer erros no código com nomes próprios. 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 < 10; i++)
      {
         a[i] = value;
      }
   }
}

Removendo um item de coleção

"Você já olhou para as coleções?"

"Literalmente com apenas um olho."

"Se você não sabe do que estou falando, anote para si mesmo para dar uma olhada no futuro. Muitas vezes, há situações em que um determinado elemento precisa ser removido de uma coleção. O código se parece mais ou menos com esse:

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 for-eachloop 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 );

Colocando várias classes com o publicmodificador em um único arquivo

"Pode haver apenas 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

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 mainmétodo 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();
  }
}

Declarando um construtor como um método

"Outro erro comum é declarar incorretamente um construtor de classe. O nome de um construtor deve ser o mesmo que o 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;
   }
}
O nome do construtor é inválido. 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.

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, ou, mais precisamente, a implementa, 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 Meov
{
}

Omitir breakem uma switchdeclaração

"E o último erro de hoje, mas não o último dos 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;
}

"Sabe, Diego... A julgar pelo conjunto de erros que você apresentou aqui, parece que você está lendo meu diário pessoal... Ou está me observando resolver tarefas."

"Ha! Não tenha dúvidas. Eu li, rastreei e continuo fazendo isso. Portanto, fique alerta!"

"???"

"Não se preocupe. Estou apenas brincando. Seja vigilante e cometa menos erros estúpidos."