JavaRush /Blog Java /Random-ES /8 errores comunes de los programadores novatos

8 errores comunes de los programadores novatos

Publicado en el grupo Random-ES
¡Hola! Hoy veremos una lista de 8 errores comunes cometidos por desarrolladores Java principiantes (y no solo). Encontrará muchas colecciones de este tipo en Internet: muchas de ellas son similares entre sí. Cuando compilamos esta lista, nos guiamos por un criterio: si nosotros mismos cometimos estos errores durante el estudio y el trabajo :) No se priorizan y son igualmente importantes para comprender y recordar.
  1. Comparar objetos usando ==.

    El operador ==compara referencias de objetos.

    Las referencias apuntan a direcciones en la memoria y, si están en direcciones diferentes, la comparación ==devolverá false.

    public class Car {
    
       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 en una clase Objectexiste un método especial: equals(). Su implementación predeterminada, francamente hablando, es regular:

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

    En la propia clase, Objectla lógica del método equals()se implementa como una comparación de dos referencias. A su vez, para comparar objetos correctamente, es necesario redefinir este método de acuerdo con los criterios que son importantes en un programa específico para objetos específicos. Los criterios de igualdad los determina usted mismo.

    Lo único que no debes olvidar es la lista de requisitos para una anulación adecuada equals(). Puede encontrarlos fácilmente en Internet, pero nuestros geniales estudiantes ya han escrito un artículo sobre este tema .

  2. Usar variables no estáticas en métodos estáticos (y viceversa).

    Si alguna vez ha visto la inscripción " No se puede hacer referencia a la variable no estática x desde un contexto estático ", bienvenido al club :)

    Los métodos estáticos no tienen acceso a variables de clase no estáticas.

    Esto es lógico: después de todo, se puede llamar a un método estático sin crear un objeto de clase, y todas las variables de campo pertenecen a objetos específicos. Ésta es la contradicción que lleva al error.

    Por el contrario, dicho sea de paso, es posible: está permitido utilizar variables estáticas en métodos no estáticos:

    public class Main {
    
       public int x = 10;
    
       public static int staticX = 100;
    
       public static void main(String[] args) {
    
           System.out.println(x);//ошибка компиляции, так нельзя!
       }
    
       public void printX() {
    
           System.out.println(staticX);//а так можно!
       }
    }
  3. Malentendido sobre cómo se pasan los parámetros a los métodos: por referencia o por valor.

    Los objetos y primitivas se pasan a métodos como parámetros de diferentes maneras: los primeros por referencia, los segundos por valor.

    A los principiantes a menudo les resulta difícil comprender este concepto, lo que hace que su código se comporte 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++;
       }
    }

    Si en este ejemplo no sabe exactamente qué número aumentará y cuál no (el número habitual o la edad del gato), vuelva a leer nuestra conferencia sobre este tema .

  4. Ignorando las reglas de escritura de código.

    Y esto se aplica no sólo al cumplimiento de ciertos principios “técnicos”, sino también a convenciones de nomenclatura banales.

    Todas estas reglas " cómo nombrar variables ", " cómo escribir nombres de métodos " se inventaron por una razón. Esto realmente afecta en gran medida la legibilidad del código.

    Ведь código не всегда будет только твоим. Ты можешь перевестись на другой проект в компании, и он перейдет по наследству к твоим коллегам, которые будут явно не в восторге, получив в работу что-то вроде этого:

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

    Твой código может быть гениальным с точки зрения производительности, но если его невозможно прочитать и понять Cómo он, собственно, работает, цена его, увы, невелика.

    Придерживайся стандартов написания, и твой código, даже далекий от идеала, хотя бы прочтут более опытные товарищи и подскажут, что с технической точки зрения в нем можно улучшить :)

  5. Непонимание работы класса String

    public class Main {
    
       public static void main(String[] args) {
    
           String s1 = "Я изучаю Java";
           String s2 = new String("Я изучаю Java");
    
           System.out.println(s1 == s2);
       }
    }

    Если ты не знаешь, почему этот código выводит false, знания явно нужно подтянуть:)

    Новички часто не знают что такое String Pool и Cómo он работает.

    Как следствие, не до конца ясно, Cómo правильно сравнивать строки в своем códigoе. В одной из наших лекций мы подробно рассматривали эту тему

  6. Неправильная работа с исключениями.

    Это свойственно не только новичкам, но и опытным разработчикам. Причин несколько.

    Во-первых, универсального рецепта не существует. Ошибки в программе бывают разные, сценарии их обработки, соответственно, тоже. Во-вторых, не все понимают структуру stackTrace, а антипаттернов обработки ошибок очень много, и каждый из них «неправилен» по-своему. Так что вариантов сделать неправильно здесь намного больше, чем где бы то ни было.

    Распространенные антипаттерны приведены здесь:

  7. Неполное понимание работы операторов (арифметических, логических и других).

    8 errores comunes de los programadores novatos - 2

    Простой пример. Сможешь сходу сказать, что выведет этот código?

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

    Если ты ответил неправильно o наугад, значит, в этой области пока есть пробелы:)

    Код выведет false, потому что приоритет у оператора сравнения == выше, чем у постфиксного инкремента ++. Поэтому сначала будет выполнено сравнение 7 == i, и только потом - операция i++.

    По этой теме, кстати, у нас тоже была подробная лекция. Вот enlace, если пропустил.

  8. Пропуск слова break в операторе switch.

    Эту ошибку, вероятно, допускали многие из читателей!)

    public class Main {
    
       public static void main(String[] args) {
    
           int i = 1;
    
           switch (i) {
    
               case 1: {
                   System.out.println("Число равно 1");
               }
               case 2: {
                   System.out.println("Число равно 2");
               }
               case 3: {
                   System.out.println("Число равно 3");
               }
           }
       }
    }

    В результате на них обрушивается водопад из всех возможных вариантов:

    Вывод:

    
    Число равно 1
    Число равно 2
    Число равно 3

    Оператор break прерывает работу оператора switch в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION