CodeGym /Blog Java /Aleatoriu /8 greșeli comune făcute de programatorii începători
John Squirrels
Nivel
San Francisco

8 greșeli comune făcute de programatorii începători

Publicat în grup
Bună! Astăzi ne vom uita la 8 greșeli foarte frecvente făcute de dezvoltatorii Java începători (și alți). Veți găsi o mulțime de astfel de liste pe web: multe dintre ele sunt similare între ele. Pe măsură ce ne-am alcătuit lista, ne-am ghidat după un singur criteriu: dacă am greșit noi înșine în timpul studiilor sau angajării :) Acestea nu sunt sortate după importanță – sunt la fel de importante pe care să le înțelegi și să le reții.
  1. Compararea obiectelor folosind == .

    Operatorul == compară referințele obiectelor.

    Referințele indică adresele din memorie. Dacă sunt stocate la adrese diferite, atunci compararea folosind == va returna 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);
        }
    }
    

    Pentru a compara obiecte, clasa Object are o metodă specială: equals() . Sincer, implementarea sa implicită nu este rea:

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

    În clasa Object însăși, metoda equals() este implementată ca o comparație a două referințe. La rândul său, pentru a compara corect obiectele, trebuie să redefiniți această metodă în funcție de criteriile care sunt relevante în programul dvs. special pentru obiectele dvs. specifice. Criteriile pentru egalitate depind de tine.

    Singurul lucru pe care nu trebuie să-l uitați este lista de cerințe pentru înlocuirea corectă a equals() . Le puteți găsi cu ușurință pe Internet.

  2. Utilizarea variabilelor non-statice în metode statice (și invers).

    Dacă ați văzut vreodată mesajul „Variabila non-statică x nu poate fi referită dintr-un context static”, bine ați venit în club :)

    Metodele statice nu au acces la variabile non-statice (instanță).

    Acest lucru are sens: la urma urmei, o metodă statică poate fi apelată fără a crea un obiect din clasa sa și toate câmpurile aparțin unor obiecte specifice. Și aici constă contradicția care provoacă eroarea.

    Apropo, mergeți în altă direcție funcționează bine: puteți utiliza variabile statice în metode non-statice:

    
    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. Înțelegerea greșită a modului în care argumentele sunt transmise metodelor: prin referință sau prin valoare.

    Obiectele și primitivele sunt transmise metodelor în două moduri diferite: în primul rând, prin referință; în al doilea rând, după valoare.

    Începătorilor le este adesea greu să înțeleagă acest concept. Drept urmare, codul lor se comportă în mod neașteptat:

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

    Dacă nu știți exact ce număr va crește și care nu (numărul vechi simplu sau vârsta pisicii), atunci recitiți lecția noastră pe această temă .

  4. Ignorarea regulilor de codificare.

    Acest lucru se aplică nu numai respectării anumitor principii „tehnice”, ci și convențiilor de numire banale.

    Toate aceste reguli (cum se numesc variabilele, cum se scrie numele metodelor) au fost inventate cu un motiv. Ele afectează cu adevărat lizibilitatea codului

    La urma urmei, codul nu va fi întotdeauna numai al tău. Este posibil să fiți transferat la un alt proiect la compania dvs. Colegii tăi care vă moștenesc codul, evident, nu vor fi fericiți când vor vedea așa ceva:

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

    Codul tău ar putea avea performanțe ingenios de înalte, dar dacă este imposibil de citit și de înțeles cum funcționează de fapt, atunci, din păcate, nu valorează prea mult.

    Dacă respectați standardele de codificare, atunci chiar dacă codul dvs. este departe de a fi ideal, cel puțin colegii dvs. mai experimentați vă vor putea spune cum poate fi îmbunătățit din punct de vedere tehnic :)

  5. Înțelegerea greșită a clasei 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);
        }
    }
    

    Dacă nu știți de ce acest cod este fals , evident că trebuie să vă consolidați cunoștințele :)

    Începătorii nu cunosc adesea String Pool și cum funcționează.

    Drept urmare, ei nu înțeleg în totalitate cum să compare corect șirurile din codul lor. Am explorat acest subiect în detaliu într- una dintre lecțiile noastre .

  6. Gestionarea greșită a excepțiilor.

    Începătorii nu sunt singurii care se împiedică de asta. Dezvoltatorii experimentați sunt și ei depășiți. Motivele sunt multe.

    În primul rând, nu există o rețetă universală. Programele au tot felul de erori diferite și scenarii diferite de tratare a erorilor.

    În al doilea rând, nu toată lumea înțelege cum este structurată o urmă de stivă . Există o mulțime de antimodeluri în gestionarea erorilor și fiecare dintre ele este „greșit” în felul său. Aceasta înseamnă că este mult mai ușor să greșiți gestionarea erorilor decât orice altceva.

  7. Nu înțelege pe deplin cum funcționează operatorii (aritmetici, logici și alții).

    8 greșeli comune făcute de programatorii începători - 2

    Iată un exemplu simplu. Puteți spune imediat ce va afișa acest cod?

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

    Dacă ai răspuns incorect sau doar ai ghicit, atunci mai ai lacune de cunoștințe în acest domeniu :)

    Codul va afișa false , deoarece operatorul de egalitate ( == ) are o prioritate mai mare decât operatorul de increment postfix ( ++ ). Prin urmare, comparația 7 == i este executată mai întâi și abia apoi este efectuată operația i++ .

    Apropo, am avut și o lecție detaliată despre asta. Iată linkul dacă l-ai ratat.

  8. Omiterea cuvântului break într-o declarație switch .

    Mulți oameni care citesc acest articol au făcut cu siguranță această greșeală! :)

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

    Ca rezultat, execuția trece prin toate opțiunile posibile:

    Ieșire:

    Numărul este egal cu 1 Numărul este egal cu 2 Numărul este egal cu 3

    O instrucțiune break întrerupe execuția instrucțiunii switch atunci când una dintre opțiuni este executată. Nu uitați sau puteți obține rezultate neașteptate :)

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