JavaRush /בלוג Java /Random-HE /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