JavaRush /Blog Java /Random-FR /8 erreurs courantes des programmeurs débutants

8 erreurs courantes des programmeurs débutants

Publié dans le groupe Random-FR
Bonjour! Aujourd'hui, nous allons examiner une liste de 8 erreurs courantes commises par les développeurs Java débutants (et pas seulement). Vous trouverez de nombreuses collections de ce type sur Internet : beaucoup d'entre elles se ressemblent. Lorsque nous avons dressé cette liste, nous avons été guidés par un critère : si nous avons nous-mêmes commis ces erreurs pendant les études et le travail :) Elles ne sont pas prioritaires et sont tout aussi importantes pour la compréhension et la mémorisation.
  1. Comparer des objets à l'aide de ==.

    L'opérateur ==compare les références d'objets.

    Les références pointent vers des adresses en mémoire, et si elles se trouvent à des adresses différentes, la comparaison ==renverra 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);
       }
    }

    Pour comparer des objets dans une classe, Objectil existe une méthode spéciale - equals(). Franchement, son implémentation par défaut est médiocre :

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

    Dans la classe elle-même, Objectla logique de la méthode equals()est implémentée comme une comparaison de deux références. À son tour, pour comparer correctement les objets, vous devez redéfinir cette méthode conformément aux critères importants dans un programme spécifique pour des objets spécifiques. Vous déterminez vous-même les critères d’égalité.

    La seule chose que vous ne devez pas oublier est la liste des conditions requises pour un remplacement approprié equals(). Vous pouvez facilement les trouver sur Internet, mais nos cool étudiants ont déjà réalisé un article sur ce sujet .

  2. Utilisation de variables non statiques dans des méthodes statiques (et vice versa).

    Si vous avez déjà vu l'inscription « La variable non statique x ne peut pas être référencée à partir d'un contexte statique » - bienvenue dans le club :)

    Les méthodes statiques n'ont pas accès aux variables de classe non statiques.

    C'est logique : après tout, une méthode statique peut être appelée sans créer d'objet de classe, et toutes les variables de champ appartiennent à des objets spécifiques. C'est la contradiction qui conduit à l'erreur.

    Au contraire, d'ailleurs, c'est possible : il est permis d'utiliser des variables statiques dans des méthodes non statiques :

    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. Incompréhension de la façon dont les paramètres sont transmis aux méthodes : par référence ou par valeur.

    Les objets et les primitives sont transmis aux méthodes en tant que paramètres de différentes manières : les premiers par référence, les seconds par valeur.

    Les débutants trouvent souvent ce concept difficile à comprendre, ce qui entraîne un comportement inattendu de leur 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++;
       }
    }

    Si dans cet exemple vous ne savez pas exactement quel nombre va augmenter et lequel ne va pas (le nombre habituel ou l'âge du chat), alors relisez notre conférence sur ce sujet .

  4. Ignorer les règles d'écriture du code.

    Et cela s'applique non seulement au respect de certains principes « techniques », mais aussi aux conventions de dénomination banales.

    Toutes ces règles « comment nommer les variables », « comment écrire les noms de méthodes » ont été inventées pour une raison. Cela affecte vraiment grandement la lisibilité du code.

    Après tout, le code ne sera pas toujours le vôtre. Vous pouvez passer à un autre projet de l'entreprise, et cela sera hérité par vos collègues, qui ne seront clairement pas contents lorsqu'ils obtiendront quelque chose comme ceci :

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

    Votre code est peut-être brillant en termes de performances, mais s’il est impossible de le lire et de comprendre comment il fonctionne réellement, sa valeur est, hélas, faible.

    Adhérez aux normes d'écriture, et votre code, même s'il est loin d'être idéal, sera au moins lu par des camarades plus expérimentés et vous dira ce qui peut y être amélioré d'un point de vue technique :)

  5. Incompréhension du travail en classeString

    public class Main {
    
       public static void main(String[] args) {
    
           String s1 = "Я изучаю Java";
           String s2 = new String("Я изучаю Java");
    
           System.out.println(s1 == s2);
       }
    }

    Si vous ne savez pas pourquoi ce code apparaît false, vous devez clairement améliorer vos connaissances :)

    Les débutants ne savent souvent pas ce que c’est String Poolet comment cela fonctionne.

    Par conséquent, il n’est pas tout à fait clair comment comparer correctement les chaînes dans votre code. Dans l'une de nos conférences, nous avons discuté de ce sujet en détail.

  6. Gestion incorrecte des exceptions.

    Ceci est typique non seulement des débutants, mais aussi des développeurs expérimentés. Il existe plusieurs raisons.

    Premièrement, il n’existe pas de recette universelle. Les erreurs dans un programme sont différentes et les scripts pour les traiter, respectivement, sont différents. Deuxièmement, tout le monde ne comprend pas la structure stackTraceet il existe de nombreux anti-modèles de gestion des erreurs, et chacun d'eux est « faux » à sa manière. Il y a donc bien plus d’options pour mal faire les choses ici que partout ailleurs.

    Les anti-modèles courants sont répertoriés ici :

  7. Неполное понимание работы операторов (арифметических, логических и других).

    8 erreurs courantes des programmeurs débutants - 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 в момент, когда отработал один из вариантов. Не стоит о нем забывать, иначе результат может быть неожиданным :)

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