JavaRush /Java блог /Random UA /8 частих помилок програмістів-початківців

8 частих помилок програмістів-початківців

Стаття з групи Random UA
Вітання! Сьогодні ми розглянемо список із 8 поширених помилок початківців (та й не тільки) Java-розробників. У Мережі ти знайдеш чимало таких добірок: багато хто з них схожий один на одного. Коли ми складали цей список, орієнтувалися на один критерій: чи припускалися ці помилки самі під час навчання та роботи :) Вони розставлені не за пріоритетом і однаково важливі для розуміння та запам'ятовування.
  1. Порівняння об'єктів за допомогою ==.

    Оператор ==порівнює посилання на об'єкти.

    Посилання вказують на адресаи в пам'яті, і якщо вони знаходяться на різні адресаи, порівняння через ==буде повертати 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);
       }
    }

    Для порівняння об'єктів у класі Objectє спеціальний метод - equals(). Його реалізація за умовчанням, прямо скажемо, так собі:

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

    У самому класі Objectлогіка методу equals()реалізована порівняння двох посилань. У свою чергу, для коректного порівняння об'єктів тобі необхідно перевизначити цей метод відповідно до тих критеріїв, які важливі у конкретній програмі для конкретних об'єктів. Критерії рівності визначаєш ти сам.

    Єдине, що не варто забувати, — список вимог для правильного перевизначення equals(). Ти легко знайдеш їх в Інтернеті, але наші круті учні вже зробабо статтю на цю тему .

  2. Використання нестатичних змінних у статичних методах (і навпаки).

    Якщо ти хоч раз бачив напис « Ласкаво просимо до клубу :)

    Статичні методи не мають доступу до нестатичних змінних класів.

    Це логічно: адже статичний метод можна викликати, не створюючи об'єкт класу, а всі змінні поля належать конкретним об'єктам. У цьому полягає суперечність, що призводить до помилки.

    Навпаки, до речі, можна використовувати статичні змінні в нестатичних методах припустимо:

    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. Нерозуміння того, як передаються параметри методи: за посиланням або за значенням.

    Об'єкти та примітиви передаються в методи як параметри по-різному: перші - за посиланням, другі - за значенням.

    Початківцям часто буває складно зрозуміти цю концепцію, в результаті їх код поводиться несподівано:

    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++;
       }
    }

    Якщо в цьому прикладі ти точно не знаєш, яке число збільшиться, а яке ні (звичайне число або вік кота), тоді перечитай ще раз нашу лекцію на цю тему .

  4. Ігнорування правил написання коду.

    І це стосується не лише дотримання тих чи інших «технічних» принципів, а й банальних угод про іменування.

    Всі ці правила " як треба називати змінні ", " як треба писати назви методів " були придумані не просто так. Це і справді сильно впливає на читання коду.

    Адже код не завжди буде лише твоїм. Ти можеш перевестися на інший проект у компанії, і він перейде у спадок до твоїх колег, які будуть явно не в захваті, отримавши в роботу щось на кшталт цього:

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

    Твій код може бути геніальним з погляду продуктивності, але якщо його неможливо прочитати і зрозуміти як він, власне, працює, ціна його, на жаль, невелика.

    Дотримуйся стандартів написання, і твій код, навіть далекий від ідеалу, хоча б прочитають досвідченіші товариші і підкажуть, що з технічного погляду в ньому можна покращити :)

  5. Нерозуміння роботи класуString

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

    Якщо ти не знаєш, чому цей код виводить false, знання явно потрібно підтягнути:)

    Новачки часто не знають що таке String Poolі як він працює.

    Як наслідок, не до кінця зрозуміло, як правильно порівнювати рядки у своєму коді. В одній із наших лекцій ми докладно розглядали цю тему

  6. Неправильна робота із винятками.

    Це властиво не лише новачкам, а й досвідченим розробникам. Причин кілька.

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

    Поширені антипатерни наведені тут:

  7. Неповне розуміння роботи операторів (арифметичних, логічних та інших).

    8 частих помилок програмістів-початківців - 2

    Простий приклад. Чи зможеш відразу сказати, що виведе цей код?

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

    Якщо ти відповів неправильно або навмання, значить, у цій галузі поки є прогалини:)

    Код виведе false, тому що пріоритет у оператора порівняння ==вищий, ніж у постфіксного інкременту ++. Тому спочатку буде виконано порівняння 7 == i, і лише потім – операція i++.

    З цієї теми, до речі, ми теж мали докладну лекцію. Ось посилання , якщо пропустив.

  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у момент, коли відпрацював один із варіантів. Не варто про нього забувати, інакше результат може бути несподіваним.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ