JavaRush /Java Blogu /Random-AZ /Təcrübəsiz proqramçıların 8 ümumi səhvi

Təcrübəsiz proqramçıların 8 ümumi səhvi

Qrupda dərc edilmişdir
Salam! Bu gün biz yeni başlayan (yalnız deyil) Java tərtibatçıları tərəfindən edilən 8 ümumi səhvin siyahısına baxacağıq. İnternetdə çoxlu belə kolleksiyalar tapa bilərsiniz: onların çoxu bir-birinə bənzəyir. Biz bu siyahını tərtib edərkən bir meyarı rəhbər tutduq: dərs və iş zamanı özümüz bu səhvlərə yol verib-verməmişik :) Bunlar prioritet deyil və başa düşmək və yadda saxlamaq üçün eyni dərəcədə vacibdir.
  1. istifadə edərək obyektlərin müqayisəsi ==.

    Operator ==obyekt istinadlarını müqayisə edir.

    İstinadlar yaddaşdakı ünvanlara işarə edir və əgər onlar müxtəlif ünvanlardadırsa, vasitəsilə müqayisə ==qayıdacaq 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);
       }
    }

    Bir sinifdəki obyektləri müqayisə etmək üçün Objectxüsusi bir üsul var - equals(). Onun standart tətbiqi, səmimi desək, belədir:

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

    Sinfin özündə Objectmetodun məntiqi equals()iki istinadın müqayisəsi kimi həyata keçirilir. Öz növbəsində, obyektləri düzgün müqayisə etmək üçün, bu metodu konkret obyektlər üçün xüsusi proqramda vacib olan meyarlara uyğun olaraq yenidən müəyyənləşdirməlisiniz. Bərabərlik meyarlarını özünüz müəyyənləşdirirsiniz.

    Unutmamalı olduğunuz yeganə şey düzgün ləğv üçün tələblərin siyahısıdır equals(). Onları İnternetdə asanlıqla tapa bilərsiniz, lakin bizim sərin tələbələrimiz artıq bu mövzuda məqalə hazırlayıblar .

  2. Statik metodlarda qeyri-statik dəyişənlərdən istifadə (və əksinə).

    Əgər siz “ Qeyri-statik dəyişən x statik kontekstdən istinad edilə bilməz ” yazısını görmüsünüzsə - kluba xoş gəlmisiniz :)

    Statik metodların statik olmayan sinif dəyişənlərinə çıxışı yoxdur.

    Bu məntiqlidir: axırda statik metodu sinif obyekti yaratmadan çağırmaq olar və bütün sahə dəyişənləri konkret obyektlərə aiddir. Bu, yanlışlığa səbəb olan ziddiyyətdir.

    Əksinə, yeri gəlmişkən, mümkündür: qeyri-statik üsullarda statik dəyişənlərdən istifadə etməyə icazə verilir:

    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. Parametrlərin metodlara necə ötürüldüyünün anlaşılmaması: istinad və ya dəyərlə.

    Obyektlər və primitivlər müxtəlif üsullarla parametrlər kimi metodlara ötürülür: birincisi istinadla, ikincisi isə dəyərlə.

    Yeni başlayanlar çox vaxt bu konsepsiyanı başa düşməkdə çətinlik çəkirlər, nəticədə onların kodları gözlənilmədən davranır:

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

    Bu nümunədə hansı rəqəmin artacağını və hansının artmayacağını (adi sayı və ya pişiyin yaşı) dəqiq bilmirsinizsə, bu mövzuda mühazirəmizi yenidən oxuyun .

  4. Игнорирование правил написания codeа.

    И это касается не только соблюдения тех or иных «технических» принципов, но и банальных соглашений об именовании.

    Все эти правила «How надо называть переменные», «How надо писать названия методов» были придуманы не просто так. Это и правда сильно влияет на читаемость codeа.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Təcrübəsiz proqramçıların 8 ümumi səhvi - 2

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

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

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

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

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

  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 в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION