JavaRush /Java blogi /Random-UZ /Ajam dasturchilarning 8 ta keng tarqalgan xatosi

Ajam dasturchilarning 8 ta keng tarqalgan xatosi

Guruhda nashr etilgan
Salom! Bugun biz boshlang'ich (va nafaqat) Java dasturchilari tomonidan yo'l qo'yilgan 8 ta keng tarqalgan xatolar ro'yxatini ko'rib chiqamiz. Internetda ko'plab bunday to'plamlarni topasiz: ularning ko'pchiligi bir-biriga o'xshash. Ushbu ro'yxatni tuzganimizda, biz bitta mezonga amal qildik: o'qish va ish paytida biz bu xatolarga yo'l qo'yganmizmi :) Ular birinchi o'ringa qo'yilmaydi va tushunish va eslab qolish uchun bir xil darajada muhimdir.
  1. dan foydalanib ob'ektlarni solishtirish ==.

    Operator ==ob'ekt havolalarini solishtiradi.

    Murojaatlar xotiradagi manzillarga ishora qiladi va agar ular turli manzillarda bo'lsa, orqali taqqoslash ==qaytariladi 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);
       }
    }

    Sinfdagi ob'ektlarni solishtirish uchun Objectmaxsus usul mavjud - equals(). Uning sukut bo'yicha amalga oshirilishi, ochig'ini aytganda, shunday:

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

    Sinfning o'zida Objectusulning mantig'i equals()ikkita havolani taqqoslash sifatida amalga oshiriladi. O'z navbatida, ob'ektlarni to'g'ri taqqoslash uchun siz ushbu usulni aniq ob'ektlar uchun muayyan dasturda muhim bo'lgan mezonlarga muvofiq qayta belgilashingiz kerak. Tenglik mezonlarini o'zingiz aniqlaysiz.

    Siz unutmasligingiz kerak bo'lgan yagona narsa - bu to'g'ri bekor qilish uchun talablar ro'yxati equals(). Siz ularni Internetda osongina topishingiz mumkin, ammo bizning ajoyib talabalarimiz allaqachon ushbu mavzu bo'yicha maqola tayyorlaganlar .

  2. Statik usullarda statik bo'lmagan o'zgaruvchilardan foydalanish (va aksincha).

    Agar siz " Statik bo'lmagan x o'zgaruvchiga statik kontekstdan murojaat qilib bo'lmaydi " yozuvini ko'rgan bo'lsangiz - klubga xush kelibsiz :)

    Statik usullar statik bo'lmagan sinf o'zgaruvchilariga kirish huquqiga ega emas.

    Bu mantiqiy: axir, statik usulni sinf ob'ektini yaratmasdan chaqirish mumkin va barcha maydon o'zgaruvchilari aniq ob'ektlarga tegishli. Bu xatoga olib keladigan qarama-qarshilikdir.

    Aksincha, aytmoqchi, bu mumkin: statik o'zgaruvchilardan statik bo'lmagan usullarda foydalanishga ruxsat beriladi:

    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. Parametrlarning usullarga qanday uzatilishini noto'g'ri tushunish: mos yozuvlar yoki qiymat bo'yicha.

    Ob'ektlar va ibtidoiylar usullarga parametr sifatida turli yo'llar bilan uzatiladi: birinchisi mos yozuvlar bo'yicha, ikkinchisi qiymat bo'yicha.

    Yangi boshlanuvchilar ko'pincha bu tushunchani tushunishni qiyin deb bilishadi, natijada ularning kodlari kutilmaganda o'zini tutadi:

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

    Agar ushbu misolda siz qaysi raqam ko'payishini va qaysi biri ko'paymasligini aniq bilmasangiz (odatdagi raqam yoki mushukning yoshi), unda ushbu mavzu bo'yicha ma'ruzamizni qayta o'qing .

  4. Kod yozish qoidalariga e'tibor bermaslik.

    Va bu nafaqat ma'lum "texnik" tamoyillarga rioya qilish, balki nomlashning oddiy konventsiyalariga ham tegishli.

    Ushbu qoidalarning barchasi " o'zgaruvchilarni qanday nomlash kerak ", " usul nomlarini qanday yozish " bir sababga ko'ra ixtiro qilingan. Bu, albatta, kodning o'qilishiga katta ta'sir qiladi.

    Ведь 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. Неполное понимание работы операторов (арифметических, логических и других).

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

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