JavaRush /مدونة جافا /Random-AR /8 أخطاء شائعة للمبرمجين المبتدئين

8 أخطاء شائعة للمبرمجين المبتدئين

نشرت في المجموعة
مرحبًا! سنلقي اليوم نظرة على قائمة تضم 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. استخدام المتغيرات غير الثابتة في الطرق الثابتة (والعكس صحيح).

    إذا سبق لك أن رأيت النقش " لا يمكن الرجوع إلى المتغير غير الثابت x من سياق ثابت " - مرحبًا بك في النادي :)

    لا تتمتع الأساليب الثابتة بإمكانية الوصول إلى متغيرات الفئة غير الثابتة.

    هذا أمر منطقي: بعد كل شيء، يمكن استدعاء طريقة ثابتة دون إنشاء كائن فئة، وجميع متغيرات المجال تنتمي إلى كائنات محددة. وهذا هو التناقض الذي يؤدي إلى الخطأ.

    على العكس من ذلك، بالمناسبة، من الممكن: يجوز استخدام المتغيرات الساكنة في الطرق غير الساكنة:

    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. تجاهل قواعد كتابة التعليمات البرمجية.

    وهذا لا ينطبق فقط على الامتثال لبعض المبادئ "التقنية"، ولكن أيضًا على اتفاقيات التسمية المبتذلة.

    كل هذه القواعد " كيفية تسمية المتغيرات "، و" كيفية كتابة أسماء الطرق " تم اختراعها لسبب ما. يؤثر هذا بشكل كبير على سهولة قراءة الكود.

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

    8 أخطاء شائعة للمبرمجين المبتدئين - 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 в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)

تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION