CodeGym /Cours Java /All lectures for FR purposes /Erreurs courantes commises par les programmeurs novices

Erreurs courantes commises par les programmeurs novices

All lectures for FR purposes
Niveau 1 , Leçon 1108
Disponible

1. Comparer des objets avec==

L'erreur préférée des programmeurs débutants consiste à comparer des objets (en particulier des chaînes) à l'aide de l' ==opérateur. Par exemple:

Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1 == s2)
{
   System.out.println("The strings are equal");
}

Ce code n'affichera jamais "Les chaînes sont égales", car l' ifinstruction compare les références à deux objets chaîne différents.

Voici la bonne version du code :

Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1.equals(s2))
{
   System.out.println("The strings are equal");
}


2. Changer un Stringobjet

Les programmeurs débutants oublient souvent que tous les objets de la classe sont immutables et que chaque méthode de la Stringclasse renvoie un nouvel objet — l'objet courant ne change jamais.

Exemple:

String s = "Hello";
s.toUpperCase (); // Convert to uppercase

Ce code est très similaire au code correct, mais il ne fonctionnera pas comme prévu. La toUpperCase()méthode ne change pas l'objet sur lequel elle est appelée. Le code correct ressemblerait à ceci :

String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase


3. Oublier d'initialiser les objets qui sont des éléments d'un tableau

Une autre erreur courante consiste à oublier d'initialiser une variable tableau. Exemple:

int[] array;
array[0] = 1;
array[0] = 2;

Ce code ne fonctionnera pas : vous devez définir explicitement la variable de tableau égale à une référence à l'objet conteneur qui stockera les éléments du tableau.

int[] array = new int[10];
array[0] = 1;
array[0] = 2;


4. Utilisation d'une variable locale au lieu d'une variable d'instance.

Les débutants n'aiment pas trouver des noms longs et significatifs pour les variables. Ils utilisent fréquemment des noms à une seule lettre : a, b, i, etc. C'est une chose cruelle à faire quand le code a plusieurs variables comme ça :

Mettez le nombre 99 dans 100 cellules d'un tableau
class Solution
{
  public static int a = 99;
  public static int i = 100;

  public static void main(String[] args)
  {
    int[] a = new int[i];
    for (int i = 0; i < 10; i++)
    {
      a[i] = a;
    }
  }
}

Le code ci-dessus ne compilera pas. La version correcte ressemble à ceci :

Mettez le nombre 99 dans 100 cellules d'un tableau
class Solution
{
   public static int value = 99;
   public static int count = 100;

   public static void main(String[] args)
   {
      int[] a = new int[count];
      for (int i = 0; i < count; i++)
      {
         a[i] = value;
      }
   }
}


5. Supprimer un élément de collection

Très souvent, il y a des situations où un certain élément doit être retiré d'une collection. Le code ressemble à peu près à ceci :

ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

for (Integer value: list)
   if (value < 0)
      list.remove(value);

Ce code ne fonctionnera pas, car vous ne pouvez pas utiliser une boucle for-each pour parcourir simultanément les éléments d'une collection et modifier cette collection.

Il existe plusieurs solutions. Tout d'abord, vous pouvez parcourir une collection et en modifier une autre :

solution 1
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

ArrayList<Integer> copy = new ArrayList<Integer>(list);
for (Integer value: copy)
   if (value < 0)
      list.remove(value);

Deuxièmement, depuis Java 8, les collections ont une removeIf()méthode, à laquelle vous pouvez passer une règle (fonction lambda) qui indique quels éléments supprimer.

Exemple:

solution 2
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

list.removeIf( x-> x<0 );


6. Placer plusieurs classes avec le publicmodificateur dans un seul fichier

Il ne peut y avoir qu'une seule classe publique dans un fichier. Plus de classes peuvent être déclarées dans un fichier, mais elles doivent soit être des classes internes d'une classe publique, soit ne pas avoir le publicmodificateur. Exemple:

Contenu du fichier Solution.java Note
public class Solution
{
}
public class Main
{
}
Ce n'est pas autorisé : deux classes publiques dans un seul fichier.
public class Solution
{
}
class Main
{
}
Mais vous pouvez le faire. La classe principale n'est pas publique
public class Solution
{
  public static class Main
  {
  }
}
Et vous pouvez le faire. La classe Main est une classe imbriquée


7. Appel des méthodes ordinaires (non statiques) d'une classe à partir de la main()méthode statique

Parfois, les programmeurs débutants essaient d'accéder à des variables et méthodes non statiques à partir de la main()méthode ou d'autres méthodes statiques. Un tel code ne fonctionnera pas, bien sûr.

public class Solution
{
   public int n = 100;
   public int[] createArray()
   {
      return new int[n];
   }

   public static void main(String[]args)
   {
      int[] array = createArray();
   }
}

La méthode principale ne peut faire référence qu'à des méthodes/variables statiques. Eh bien, ou il doit d'abord créer une instance de la Solutionclasse, puis appeler des méthodes non statiques de cet objet. Exemple:

solution 1 solution 2
public class Solution
{
  public static int n = 100;

  public static int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    int[] array = createArray();
  }
}
public class Solution
{
  public int n = 100;

  public int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    Solution sol = new Solution();
    int[] array = sol.createArray();
  }
}


8. Déclarer un constructeur comme une méthode

Une autre erreur courante consiste à déclarer de manière incorrecte un constructeur de classe. Le nom d'un constructeur doit être le même que le nom de la classe, et un constructeur n'a pas de type de résultat. Les erreurs les plus courantes ressemblent à ceci :

public class Person
{
   private String value;

   void Person(String value)
   {
      this.value = value;
   }
}




Il ne devrait pas y avoir de type de retour ici
public class Person
{
   private String value;

   constructor(String value)
   {
      this.value = value;
   }
}




Nom de constructeur non valide. Le nom du constructeur doit correspondre au nom de la classe
public class Person
{
   private String value;

   Person(String value)
   {
      value = value;
   }
}






this est manquant. La valuevariable sera assignée à elle-même
public class Person
{
   private String value;

   Person(String value)
   {
      this.value = value;
   }
}




C'est tout à fait exact


9. Héritage incorrect des interfaces

Les créateurs de Java ont essayé de le rendre très proche de l'anglais, ils ont donc choisi des mots-clés différents pour certains concepts connexes.

Lorsqu'une classe hérite d'une classe, il faut utiliser le extendsmot clé :

class Pet
{
}

class Cat extends Pet
{
}

Lorsqu'une classe hérite d'une interface, vous devez utiliser le implementsmot-clé :

interface Meow
{
}

class Cat implements Meow
{
}

Lorsqu'une interface hérite d'une interface, utilisez le extendsmot clé :

interface Meow
{
}

interface Voice extends Meow
{
}


10. Omettre breakdans une switchdéclaration

Et la dernière erreur pour nous aujourd'hui, mais pas la dernière pour les débutants, est de ne pas inclure une breakdéclaration dans une switchdéclaration. Exemple

Faux Droite
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
   case TUESDAY:
      System.out.println("Tuesday");
   case WEDNESDAY:
      System.out.println("Wednesday");
   case THURSDAY:
      System.out.println("Thursday");
   case FRIDAY:
      System.out.println("Friday");
   case SATURDAY:
      System.out.println("Saturday");
   case SUNDAY:
      System.out.println("Sunday");
}
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
      break;
   case TUESDAY:
      System.out.println("Tuesday");
      break;
   case WEDNESDAY:
      System.out.println("Wednesday");
      break;
   case THURSDAY:
      System.out.println("Thursday");
      break;
   case FRIDAY:
      System.out.println("Friday");
      break;
   case SATURDAY:
      System.out.println("Saturday");
      break;
   case SUNDAY:
      System.out.println("Sunday");
      break;
}

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