"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 if
instruçã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 String
objeto
"Os programadores novatos geralmente esquecem que todos os objetos da classe são imutáveis e que todo método da String
classe 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
, b
e 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 |
---|
|
"É 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 |
---|
|
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-each
loop 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 |
---|
|
"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 |
---|
|
Colocando várias classes com o public
modificador 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 public
modificador. Exemplo:
Conteúdo do arquivo Solution.java | Observação |
---|---|
|
Isso não é permitido: duas classes públicas em um único arquivo. |
|
Mas você pode fazer isso. A classe Main não é pública |
|
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 main
método só pode se referir a métodos/variáveis estáticos. Bem, ou ele deve primeiro criar uma instância da Solution
classe e só então chamar os métodos não estáticos desse objeto. Exemplo:
Solução 1 | Solução 2 |
---|---|
|
|
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:
|
Não deveria haver um tipo de retorno aqui |
|
O nome do construtor é inválido. Deve corresponder ao nome da classe |
|
this está desaparecido. A value variável será atribuída a si mesma |
|
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 extends
palavra-chave:
class Pet
{
}
class Cat extends Pet
{
}
"Quando uma classe herda uma interface, ou, mais precisamente, a implementa, você precisa usar a implements
palavra-chave:
interface Meow
{
}
class Cat implements Meow
{
}
"Quando uma interface herda uma interface, use a extends
palavra-chave:
interface Meow
{
}
interface Voice extends Meov
{
}
Omitir break
em uma switch
declaração
"E o último erro de hoje, mas não o último dos iniciantes, é deixar de incluir uma break
declaração em uma switch
declaração. Exemplo:
Errado | Certo |
---|---|
|
|
"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."
GO TO FULL VERSION