CodeGym /Java blog /Tilfældig /8 almindelige fejl begået af rookie-programmører
John Squirrels
Niveau
San Francisco

8 almindelige fejl begået af rookie-programmører

Udgivet i gruppen
Hej! I dag vil vi se på 8 meget almindelige fejl begået af rookie (og andre) Java-udviklere. Du finder masser af sådanne lister på nettet: mange af dem ligner hinanden. Da vi kompilerede vores liste, blev vi styret af ét kriterium: om vi selv lavede fejlene under vores studier eller ansættelse :) De er ikke sorteret efter vigtighed - de er lige vigtige for dig at forstå og huske.
  1. Sammenligning af objekter ved hjælp af == .

    Operatoren == sammenligner objektreferencer.

    Referencer peger på adresser i hukommelsen. Hvis de er gemt på forskellige adresser, vil sammenligning med == returnere falsk .

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

    For at sammenligne objekter har Object- klassen en speciel metode: equals() . Helt ærligt, dens standardimplementering er ikke dårlig:

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

    I selve Object- klassen er equals()- metoden implementeret som en sammenligning af to referencer. Til gengæld, for at kunne sammenligne objekter korrekt, skal du omdefinere denne metode i henhold til de kriterier, der er relevante i dit særlige program for dine specifikke objekter. Kriterierne for ligestilling er op til dig.

    Det eneste du ikke må glemme er listen over krav til korrekt tilsidesættelse af equals() . Du kan nemt finde dem på internettet.

  2. Brug af ikke-statiske variable i statiske metoder (og omvendt).

    Hvis du nogensinde har set beskeden "Ikke-statisk variabel x kan ikke refereres fra en statisk kontekst", velkommen til klubben :)

    Statiske metoder har ikke adgang til ikke-statiske (instans) variabler.

    Dette giver mening: Når alt kommer til alt, kan en statisk metode kaldes uden at oprette et objekt af dens klasse, og alle felter tilhører specifikke objekter. Og heri ligger den modsætning, der forårsager fejlen.

    Forresten fungerer det fint at gå den anden vej: du kan bruge statiske variable i ikke-statiske metoder:

    
    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. Misforståelse af, hvordan argumenter overføres til metoder: ved reference eller ved værdi.

    Objekter og primitiver overføres til metoder på to forskellige måder: for det første ved reference; for det andet efter værdi.

    Begyndere har ofte svært ved at forstå dette koncept. Som et resultat opfører deres kode sig uventet:

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

    Hvis du ikke ved præcist, hvilket tal der vil stige, og hvilket der ikke vil (det almindelige gamle tal eller kattens alder), så læs vores lektion om emnet igen .

  4. Ignorerer kodningsregler.

    Det gælder ikke kun overholdelse af visse "tekniske" principper, men også banale navnekonventioner.

    Alle disse regler (hvordan man navngiver variabler, hvordan man skriver metodenavne) blev opfundet af en grund. De påvirker virkelig kodens læsbarhed

    Når alt kommer til alt, vil koden ikke altid være din alene. Du kan blive overført til et andet projekt i din virksomhed. Dine kolleger, der arver din kode, vil naturligvis ikke være glade, når de ser noget som dette:

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

    Din kode har måske genialt høj ydeevne, men hvis det er umuligt at læse og forstå, hvordan det rent faktisk fungerer, så er det desværre ikke meget værd.

    Hvis du holder dig til kodningsstandarder, så selvom din kode langt fra er ideel, vil i det mindste dine mere erfarne kolleger kunne fortælle dig, hvordan den kan forbedres fra et teknisk synspunkt :)

  5. Misforståelse af String- klassen

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

    Hvis du ikke ved, hvorfor denne kode viser falsk , skal du naturligvis styrke din viden :)

    Begyndere er ofte uvidende om String Pool , og hvordan den fungerer.

    Som et resultat forstår de ikke helt, hvordan de korrekt sammenligner strenge i deres kode. Vi udforskede dette emne i detaljer i en af ​​vores lektioner .

  6. Håndtering af undtagelser forkert.

    Begyndere er ikke de eneste, der falder over dette. Erfarne udviklere bliver også snublet. Årsagerne er mange.

    For det første er der ingen universel opskrift. Programmer har alle mulige forskellige fejl og forskellige fejlhåndteringsscenarier.

    For det andet er det ikke alle, der forstår, hvordan et stakspor er opbygget. Der er mange fejlhåndterings-antimønstre, og hver af dem er "forkerte" på sin egen måde. Det betyder, at det er meget nemmere at få fejlhåndtering forkert end næsten alt andet.

  7. Forstår ikke fuldt ud, hvordan operatorer (aritmetiske, logiske og andre) fungerer.

    8 almindelige fejl begået af rookie-programmører - 2

    Her er et simpelt eksempel. Kan du fortælle med det samme, hvad denne kode vil vise?

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

    Hvis du svarede forkert eller bare gættede, så har du stadig videnshuller på dette område :)

    Koden vil vise falsk , fordi lighedsoperatoren ( == ) har højere prioritet end postfix-inkrementoren ( ++ ). Derfor ekskluderes 7 == i sammenligningen først, og først derefter udføres i++ operationen.

    Vi havde i øvrigt også en detaljeret lektion om dette. Her er linket , hvis du gik glip af det.

  8. Udeladelse af ordet break i en switch- sætning.

    Mange mennesker, der læser denne artikel, har helt sikkert begået denne fejl! :)

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

    Som et resultat tumler udførelsen gennem alle mulige muligheder:

    Produktion:

    Tallet er lig med 1 Tallet er lig med 2 Tallet er lig med 3

    En break -sætning afbryder udførelsen af ​​switch- sætningen, når en af ​​mulighederne er færdig med at blive eksekveret. Glem det ikke, ellers kan du få uventede resultater :)

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