CodeGym /Blog Java /Random-PL /8 typowych błędów popełnianych przez początkujących progr...
Autor
John Selawsky
Senior Java Developer and Tutor at LearningTree

8 typowych błędów popełnianych przez początkujących programistów

Opublikowano w grupie Random-PL
Cześć! Dzisiaj przyjrzymy się 8 bardzo częstym błędom popełnianym przez początkujących (i innych) programistów Java. W sieci znajdziesz mnóstwo takich list: wiele z nich jest do siebie podobnych. Sporządzając naszą listę kierowaliśmy się jednym kryterium: czy sami popełniliśmy błędy podczas studiów lub pracy :) Nie są one posortowane według ważności — są równie ważne, abyś je zrozumiał i zapamiętał.
  1. Porównywanie obiektów za pomocą == .

    Operator == porównuje odwołania do obiektów.

    Odwołania wskazują adresy w pamięci. Jeśli są przechowywane pod różnymi adresami, porównanie przy użyciu == zwróci 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);
        }
    }
    

    Aby porównać obiekty, klasa Object ma specjalną metodę: equals() . Szczerze mówiąc, jego domyślna implementacja nie jest zła:

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

    W samej klasie Object metoda equals() jest zaimplementowana jako porównanie dwóch referencji. Z kolei aby poprawnie porównywać obiekty, musisz przedefiniować tę metodę zgodnie z kryteriami, które są istotne w Twoim programie dla konkretnych obiektów. Kryteria równości zależą od ciebie.

    Jedyną rzeczą, o której nie możesz zapomnieć, jest lista wymagań dotyczących prawidłowego przesłonięcia equals() . Bez problemu znajdziesz je w Internecie.

  2. Wykorzystanie zmiennych niestatycznych w metodach statycznych (i odwrotnie).

    Jeśli kiedykolwiek widziałeś komunikat „Nie można odwoływać się do zmiennej niestatycznej x z kontekstu statycznego”, witaj w klubie :)

    Metody statyczne nie mają dostępu do zmiennych niestatycznych (instancyjnych).

    Ma to sens: w końcu metodę statyczną można wywołać bez tworzenia obiektu jej klasy, a wszystkie pola należą do określonych obiektów. I tu leży sprzeczność, która powoduje błąd.

    Nawiasem mówiąc, pójście w drugą stronę działa dobrze: możesz używać zmiennych statycznych w metodach niestatycznych:

    
    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. Niezrozumienie, w jaki sposób argumenty są przekazywane do metod: przez referencję lub przez wartość.

    Obiekty i prymitywy są przekazywane do metod na dwa różne sposoby: po pierwsze przez referencję; po drugie według wartości.

    Początkującym często trudno jest zrozumieć tę koncepcję. W rezultacie ich kod zachowuje się nieoczekiwanie:

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

    Jeśli nie wiesz dokładnie, która liczba wzrośnie, a która nie (stara liczba lub wiek kota), przeczytaj ponownie naszą lekcję na ten temat .

  4. Ignorowanie zasad kodowania.

    Dotyczy to nie tylko zgodności z pewnymi „technicznymi” zasadami, ale także przyziemnymi konwencjami nazewnictwa.

    Wszystkie te zasady (jak nazywać zmienne, jak pisać nazwy metod) zostały wymyślone z jakiegoś powodu. Naprawdę wpływają na czytelność kodu

    W końcu kod nie zawsze będzie tylko twój. Możesz zostać przeniesiony do innego projektu w swojej firmie. Twoi współpracownicy, którzy odziedziczą twój kod, oczywiście nie będą zadowoleni, gdy zobaczą coś takiego:

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

    Twój kod może mieć genialnie wysoką wydajność, ale jeśli nie można go przeczytać i zrozumieć, jak faktycznie działa, to niestety nie jest wiele wart.

    Jeśli trzymasz się standardów kodowania, to nawet jeśli Twój kod jest daleki od ideału, przynajmniej Twoi bardziej doświadczeni współpracownicy będą w stanie powiedzieć Ci, jak można go ulepszyć od strony technicznej :)

  5. Niezrozumienie klasy 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);
        }
    }
    

    Jeśli nie wiesz, dlaczego ten kod wyświetla false , musisz oczywiście poszerzyć swoją wiedzę :)

    Początkujący często nie są świadomi puli strun i jej działania.

    W rezultacie nie do końca rozumieją, jak prawidłowo porównywać ciągi znaków w swoim kodzie. Szczegółowo omawialiśmy ten temat na jednej z naszych lekcji .

  6. Nieprawidłowa obsługa wyjątków.

    Początkujący nie są jedynymi, którzy się na to natkną. Doświadczeni programiści też się potykają. Przyczyn jest wiele.

    Po pierwsze, nie ma uniwersalnej recepty. Programy mają różnego rodzaju błędy i różne scenariusze obsługi błędów.

    Po drugie, nie wszyscy rozumieją, jak zbudowany jest ślad stosu . Istnieje wiele antywzorców obsługujących błędy, a każdy z nich jest „błędny” na swój sposób. Oznacza to, że o wiele łatwiej jest pomylić obsługę błędów niż cokolwiek innego.

  7. Nie do końca rozumie, jak działają operatory (arytmetyczne, logiczne i inne).

    8 typowych błędów popełnianych przez początkujących programistów - 2

    Oto prosty przykład. Czy możesz od razu powiedzieć, co wyświetli ten kod?

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

    Jeśli odpowiedziałeś błędnie lub po prostu zgadłeś, to nadal masz luki w wiedzy w tym obszarze :)

    Kod wyświetli false , ponieważ operator równości ( == ) ma wyższy priorytet niż operator inkrementacji przyrostka ( ++ ). Dlatego najpierw wykonywane jest porównanie 7 == i , a dopiero potem wykonywana jest operacja i++ .

    Nawiasem mówiąc, mieliśmy również szczegółową lekcję na ten temat. Oto link , jeśli go przegapiłeś.

  8. Pominięcie podziału słowa w instrukcji switch .

    Wiele osób czytających ten artykuł z pewnością popełniło ten błąd! :)

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

    W rezultacie wykonanie przechodzi przez każdą możliwą opcję:

    Wyjście:

    Liczba jest równa 1 Liczba jest równa 2 Liczba jest równa 3

    Instrukcja break przerywa wykonywanie instrukcji switch , gdy jedna z opcji jest wykonywana. Nie zapomnij o tym, bo możesz uzyskać nieoczekiwane rezultaty :)

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