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 if
instruçã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 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.
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 |
---|
|
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 |
---|
|
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 |
---|
|
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 |
---|
|
6. Colocar várias classes com o public
modificador 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 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 |
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 Solution
classe e só então chamar os métodos não estáticos desse objeto. Exemplo:
Solução 1 | Solução 2 |
---|---|
|
|
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:
|
Não deveria haver um tipo de retorno aqui |
|
Nome de construtor inválido. O nome do construtor deve corresponder ao nome da classe |
|
this está desaparecido. A value variável será atribuída a si mesma |
|
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 extends
palavra-chave:
class Pet
{
}
class Cat extends Pet
{
}
Quando uma classe herda uma interface, 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 Meow
{
}
10. Omitir break
em uma switch
declaração
E o último erro para nós hoje, mas não o último para iniciantes, é deixar de incluir uma break
declaração em uma switch
declaração. Exemplo
Errado | Certo |
---|---|
|
|
GO TO FULL VERSION