CodeGym /Blogue Java /Random-PT /8 erros comuns cometidos por programadores novatos
John Squirrels
Nível 41
San Francisco

8 erros comuns cometidos por programadores novatos

Publicado no grupo Random-PT
Oi! Hoje veremos 8 erros muito comuns cometidos por desenvolvedores Java novatos (e outros). Você encontrará muitas dessas listas na web: muitas delas são semelhantes entre si. Ao compilar nossa lista, fomos guiados por um critério: se cometemos os erros durante nossos estudos ou emprego :) Eles não são classificados por importância - são igualmente importantes para você entender e lembrar.
  1. Comparando objetos usando == .

    O operador == compara referências de objetos.

    As referências apontam para endereços na memória. Se eles forem armazenados em endereços diferentes, a comparação usando == retornará false .

    
    public class Vehicle {
     
        String model;
        int maxSpeed;
        int yearOfManufacture;
     
        public Car(String model, int maxSpeed, int yearOfManufacture) {
            this.model = model;
            this.maxSpeed = maxSpeed;
            this.yearOfManufacture = yearOfManufacture;
        }
     
        public static void main(String[] args) {
            Car ferrari = new Car("Ferrari 360 Spider", 280, 1996);
            Car ferrariTwin = new Car("Ferrari 360 Spider", 280, 1996);
            System.out.println(ferrari == ferrariTwin);
        }
    }
    

    Para comparar objetos, a classe Object possui um método especial: equals() . Francamente, sua implementação padrão não é ruim:

    
    public boolean equals(Object obj) {
        return (this == obj);
    }
    

    Na própria classe Object , o método equals() é implementado como uma comparação de duas referências. Por sua vez, para comparar objetos corretamente, você precisa redefinir esse método de acordo com os critérios relevantes em seu programa específico para seus objetos específicos. Os critérios de igualdade são com você.

    A única coisa que você não deve esquecer é a lista de requisitos para substituir equals() corretamente . Você pode encontrá-los facilmente na Internet.

  2. Usando variáveis ​​não estáticas em métodos estáticos (e vice-versa).

    Se você já viu a mensagem "Variável não estática x não pode ser referenciada a partir de um contexto estático", seja bem-vindo ao clube :)

    Os métodos estáticos não têm acesso a variáveis ​​não estáticas (de instância).

    Isso faz sentido: afinal, um método estático pode ser chamado sem criar um objeto de sua classe, e todos os campos pertencem a objetos específicos. E aqui reside a contradição que causa o erro.

    A propósito, fazer o contrário funciona bem: você pode usar variáveis ​​estáticas em métodos não estáticos:

    
    public class Main {
     
        public int x = 10;
     
        public static int staticX = 100;
     
        public static void main(String[] args) {
     
            System.out.println(x); // Compilation error - you can't do this!
        }
     
        public void printX() {
     
            System.out.println(staticX); // But you can do this!
        }
    }
    

  3. Incompreensão de como os argumentos são passados ​​para os métodos: por referência ou por valor.

    Objetos e primitivos são passados ​​para métodos de duas maneiras diferentes: primeiro, por referência; segundo, por valor.

    Iniciantes geralmente acham difícil entender esse conceito. Como resultado, seu código se comporta de forma inesperada:

    
    public class Main {
     
        public static void main(String[] args) {
     
            int x = 7;
            incrementNumber(x);
            System.out.println(x);
     
            Cat cat = new Cat(7);
            catLevelUp(cat);
            System.out.println(cat.getAge());
     
        }
     
        public static void catLevelUp(Cat cat) {
     
            cat.setAge(cat.getAge()+1);
        }
     
        public static void incrementNumber(int x) {
            x++;
        }
    }
    

    Se você não sabe exatamente qual número aumentará e qual não aumentará (o número simples ou a idade do gato), releia nossa lição sobre o assunto .

  4. Ignorando as regras de codificação.

    Isso se aplica não apenas à conformidade com certos princípios "técnicos", mas também às convenções de nomenclatura mundanas.

    Todas essas regras (como nomear variáveis, como escrever nomes de métodos) foram inventadas por uma razão. Eles realmente afetam a legibilidade do código

    Afinal, nem sempre o código será só seu. Você pode ser transferido para um projeto diferente em sua empresa. Seus colegas de trabalho que herdam seu código obviamente não ficarão felizes quando virem algo assim:

    
    public class Cat {
     
        private int S_O_M_E_T_H_I_N_G = 7;
        public String striiiiiiiiiiiiiing;
        protected double I_HAVE_NO_IDEA_WHAT_THIS_IS = 3.14;
        boolean random = Math.random() > 0.5;
     
    }
    

    Seu código pode ter um desempenho engenhosamente alto, mas se for impossível ler e entender como ele realmente funciona, então, infelizmente, não vale muito.

    Se você seguir os padrões de codificação, mesmo que seu código esteja longe do ideal, pelo menos seus colegas de trabalho mais experientes poderão lhe dizer como ele pode ser melhorado do ponto de vista técnico :)

  5. Entendendo mal a classe String

    
    public class Main {
     
        public static void main(String[] args) {
     
            String s1 = "I'm learning Java";
            String s2 = new String("I'm learning Java");
     
            System.out.println(s1 == s2);
        }
    }
    

    Se você não sabe por que esse código exibe false , obviamente precisa aprimorar seu conhecimento :)

    Os iniciantes muitas vezes desconhecem o String Pool e como ele funciona.

    Como resultado, eles não entendem totalmente como comparar strings corretamente em seu código. Exploramos esse tópico em detalhes em uma de nossas aulas .

  6. Manipulando exceções incorretamente.

    Iniciantes não são os únicos que tropeçam nisso. Desenvolvedores experientes também tropeçam. As razões são muitas.

    Em primeiro lugar, não existe uma receita universal. Os programas têm todos os tipos de erros diferentes e diferentes cenários de tratamento de erros.

    Em segundo lugar, nem todos entendem como um rastreamento de pilha é estruturado. Existem muitos antipadrões de tratamento de erros, e cada um deles está "errado" à sua maneira. Isso significa que é muito mais fácil errar no tratamento de erros do que qualquer outra coisa.

  7. Não entender completamente como funcionam os operadores (aritméticos, lógicos e outros).

    8 erros comuns cometidos por programadores novatos - 2

    Aqui está um exemplo simples. Você pode dizer imediatamente o que esse código exibirá?

    
    public class Main {
     
        public static void main(String[] args) {
     
            int i = 6;
            System.out.println(7 == i++);
        }
    }
    

    Se você respondeu incorretamente ou apenas adivinhou, ainda tem lacunas de conhecimento nesta área :)

    O código exibirá false , porque o operador de igualdade ( == ) tem prioridade mais alta que o operador de incremento postfix ( ++ ). Portanto, a comparação 7 == i é executada primeiro e só então a operação i++ é executada.

    A propósito, também tivemos uma lição detalhada sobre isso. Aqui está o link se você perdeu.

  8. Omitir a palavra break em uma instrução switch .

    Muitas pessoas que estão lendo este artigo certamente cometeram esse erro! :)

    
    public class Main {
     
        public static void main(String[] args) {
     
            int i = 1;
     
            switch (i) {
     
                case 1: {
                    System.out.println("The number is equal to 1");
                }
                case 2: {
                    System.out.println("The number is equal to 2");
                }
                case 3: {
                    System.out.println("The number is equal to 3");
                }
            }
        }
     }
    

    Como resultado, a execução passa por todas as opções possíveis:

    Saída:

    O número é igual a 1 O número é igual a 2 O número é igual a 3

    Uma instrução break interrompe a execução da instrução switch quando uma das opções termina de ser executada. Não se esqueça ou você pode obter resultados inesperados :)

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION