CodeGym /Java блог /Случаен /8 често срещани грешки, допускани от начинаещи програмист...
John Squirrels
Ниво
San Francisco

8 често срещани грешки, допускани от начинаещи програмисти

Публикувано в групата
здрасти Днес ще разгледаме 8 много често срещани грешки, допускани от начинаещи (и други) Java разработчици. Ще намерите много такива списъци в мрежата: много от тях са подобни един на друг. Докато съставяхме нашия списък, се ръководехме от един критерий: дали сами сме допуснали грешките по време на обучението or на работа :) Те не са сортирани по важност — те са еднакво важни, за да разберете и запомните.
  1. Сравняване на обекти с помощта на == .

    Операторът == сравнява препратките към обекти.

    Препратките сочат към addressи в паметта. Ако се съхраняват на различни addressи, сравнението с помощта на == ще върне false .

    
    public class Vehicle {
     
        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ство зависят от вас.

    Единственото нещо, което не трябва да забравяте, е списъкът с изисквания за правилно замяна на 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); // Compilation error - you can't do this!
        }
     
        public void printX() {
     
            System.out.println(staticX); // But you can do this!
        }
    }
    

  3. Неразбиране на начина, по който аргументите се предават на методите: по препратка or по стойност.

    Обектите и примитивите се предават на методите по два различни начина: първо, чрез препратка; второ, по стойност.

    На начинаещите често им е трудно да разберат тази концепция. В резултат на това техният code се държи неочаквано:

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

    Ако не знаете точно кое число ще се увеличи и кое не (обикновеното старо число or възрастта на котката), прочетете отново нашия урок по темата .

  4. Пренебрегване на правилата за codeиране.

    Това се отнася не само за спазването на определени "технически" принципи, но и за светските конвенции за именуване.

    Всички тези правила (How да именуваме променливи, How да пишем имена на методи) са измислени с причина. Те наистина влияят на четливостта на codeа

    В крайна сметка codeът не винаги ще бъде само ваш. Може да бъдете прехвърлен към друг проект във вашата компания. Вашите колеги, които наследяват вашия code, очевидно няма да се зарадват, когато видят нещо подобно:

    
    public class Cat {
     
        private int S_O_M_E_T_H_I_N_G = 7;
        public String striiiiiiiiiiiiiing;
        protected double I_HAVE_NO_IDEA_WHAT_THIS_IS = 3.14;
        boolean random = Math.random() > 0.5;
     
    }
    

    Вашият code може да има гениално висока производителност, но ако е невъзможно да се прочете и разбере How всъщност работи, тогава, уви, не струва много.

    Ако се придържате към стандартите за codeиране, тогава дори вашият code да е далеч от идеалния, поне вашите по-опитни колеги ще могат да ви кажат How може да бъде подобрен от техническа гледна точка :)

  5. Неразбиране на класа String

    
    public class Main {
     
        public static void main(String[] args) {
     
            String s1 = "I'm learning Java";
            String s2 = new String("I'm learning Java");
     
            System.out.println(s1 == s2);
        }
    }
    

    Ако не знаете защо този code показва false , очевидно трябва да подобрите знанията си :)

    Начинаещите често не знаят за String Pool и How работи.

    В резултат на това те не разбират напълно How правилно да сравняват низове в своя code. Разгледахме тази тема подробно в един от нашите уроци .

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

    Начинаещите не са единствените, които се спъват в това. Опитните разработчици също се спъват. Причините са много.

    Първо, няма универсална рецепта. Програмите имат всяHowви различни грешки и различни сценарии за обработка на грешки.

    Второ, не всеки разбира How е структурирана следата на стека . Има много антимодели за обработка на грешки и всеки от тях е "грешен" по свой начин. Това означава, че е много по-лесно да получите грешна обработка на грешки, отколкото почти всичко друго.

  7. Не разбирам напълно How работят операторите (аритметични, логически и други).

    8 често срещани грешки, допускани от начинаещи програмисти - 2

    Ето един прост пример. Можете ли да кажете веднага Howво ще покаже този code?

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

    Ако сте отговорor неправилно or просто сте познали, значи все още имате пропуски в знанията в тази област :)

    Кодът ще покаже false , тъй като операторът за equalsство ( == ) има по-висок приоритет от оператора за постфиксно увеличение ( ++ ). Следователно първо се изпълнява сравнението 7 == i и едва след това се изпълнява операцията i++ .

    Между другото, имахме и подробен урок за това. Ето линка , ако сте го пропуснали.

  8. Пропускане на прекъсването на думата в команда за превключване .

    Много хора, които четат тази статия, със сигурност са направor тази грешка! :)

    
    public class Main {
     
        public static void main(String[] args) {
     
            int i = 1;
     
            switch (i) {
     
                case 1: {
                    System.out.println("The number is equal to 1");
                }
                case 2: {
                    System.out.println("The number is equal to 2");
                }
                case 3: {
                    System.out.println("The number is equal to 3");
                }
            }
        }
     }
    

    В резултат на това изпълнението преминава през всяка възможна опция:

    Изход:

    Числото е равно на 1 Числото е равно на 2 Числото е равно на 3

    Операторът break прекъсва изпълнението на оператора switch , когато една от опциите приключи с изпълнението. Не го забравяйте or може да получите неочаквани резултати :)

Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION