"Salut, Amigo ! Continuons à parler des erreurs. Cette fois, nous allons explorer les erreurs pour lesquelles le compilateur ne vous aidera pas toujours. Faites attention et vous apprendrez quelque chose sur vous-même."

"Je suis prêt à écouter, Diego. J'espère que ce ne sera pas trop embarrassant pour moi."

Comparer des objets avec==

"Notre liste des erreurs préférées des programmeurs débutants commence par la comparaison d'objets (en particulier de chaînes) à l'aide de l' ==opérateur"

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

"Je l'ai fait assez souvent. Maintenant, je vois clairement que ce code n'affichera jamais "Les chaînes sont égales", car l' ifinstruction compare les références à deux objets chaîne différents."

"Oui. C'est pourquoi l'option correcte serait :

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

Modification d'un Stringobjet

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

"Il n'y a pas si longtemps, j'ai appris ce que signifie immuable , mais je pense que je l'ai fait.

"J'en suis assez certain. 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

"Exactement. Je l'ai fait, mais je n'ai même pas vraiment compris ce qui n'allait pas. Merci pour la clarification !"

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. Version correcte :

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

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."

"C'est tellement vrai. Pour faire avancer les choses rapidement, je donne parfois des noms de variables comme a, bet i."

"Ne faites pas ça. 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;
    }
  }
}

"Il est beaucoup plus difficile de faire des erreurs dans le code avec des noms propres. 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 < 10; i++)
      {
         a[i] = value;
      }
   }
}

Suppression d'un élément de collection

"Vous êtes-vous déjà penché sur les collections ?"

"Littéralement avec un seul œil."

"Si vous ne savez pas de quoi je parle, alors notez-vous pour jeter un coup d'œil à l'avenir. Très souvent, il y a des situations où un certain élément doit être supprimé d'une collection. Le code ressemble à peu près à ce:

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 for-eachboucle pour parcourir simultanément les éléments d'une collection et modifier cette collection.

"Il existe plusieurs solutions. Premièrement, 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 );

Placer plusieurs classes avec le publicmodificateur dans un seul fichier

"Il ne peut y avoir qu'une seule classe publique dans un fichier. Plusieurs 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 modificateur. Exemplepublic :

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

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 mainméthode ne peut faire référence qu'à des méthodes/variables statiques. Eh bien, ou elle 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();
  }
}

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;
   }
}
Le nom du constructeur n'est pas valide. Il 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.

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, ou, plus précisément, l'implémente, 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 Meov
{
}

Omission breakdans une switchdéclaration

"Et la dernière erreur pour 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;
}

"Tu sais, Diego... A en juger par l'ensemble des erreurs que tu as présentées ici, j'ai l'impression que tu as lu mon journal personnel... Ou que tu m'as regardé résoudre des tâches."

"Ha ! N'en doutez pas. J'ai lu, suivi et je continue à le faire. Soyez donc vigilant !"

"???"

"Ne t'inquiète pas. Je plaisante. Sois vigilant et fais moins d'erreurs stupides."