FAQ (questions fréquemment posées)

Q: Je ne suis pas sûr que mon archive contienne les sources de mon programme, que faire ?

Si vous n'êtes pas sûr du contenu d'une archive jar, vous pouvez vérifier son contenu avec la ligne de commande suivante :

jar -tvf monArchive.jar

Si la ligne de commande n'est pas accessible, vous pouvez désarchiver votre jar comme une archive classique avec des logiciels comme 7zip.

Q: Est-il vrai qu'une classe doit forcément avoir un constructeur ?

Oui et non.

Oui, dans un sens, car si elle n'est pas static, une classe possède obligatoirement et implicitement un constructeur sans argument. En effet, elle possèdera au moins un constructeur sans argument hérité de la classe Object.

Non, dans le sens où on n'est pas obligé de définir explicitement un constructeur dans une classe car justement elle hérite du constructeur sans argument de la classe Objet. Par contre, si une classe B hérite d'une autre classe A possédant un constructeur avec des arguments, on est obligé de définir un constructeur avec les mêmes arguments que le constructeur de A dans B (mais cela Eclipse vous l'indiquera).

Par exemple :

public class A {
   public A(Object o) {
      //...
   }
}

public class B extends A {
   public B(Object o) { // constructeur obligatoire
      super(o);
      //...
   }
}

Q: Est-ce que le bloc finally après un try...catch est équivalent à un bloc normal ?

Non, pour deux raisons :

  1. Après un bloc finally, on ne peut que fermer le bloc, donc on ne peut pas mettre d'autres instructions.
  2. Les instructions contenus dans le bloc finally seront forcément exécutées, même s'il y a un return avant.

Par exemple, on considère la classe suivante :

public class TestException {
   public static int test(int x, int y) {
      int z = 0;
      try {
         System.out.println("on est dans le try");
         z = x/y; 
         System.out.println("Valeur de z = " + z);
         return z;
      } catch (ArithmeticException ae) {
         System.out.println("on est dans le catch");
         System.out.println(ae.getMessage());
         y = 1;
         z = x/y; 
         System.out.println("Valeur de z = " + z);
         return z;
      } finally {
         System.out.println("on est dans le finally");
      } 
   }

   public static void main (String[] args) {
      System.out.println("Résultat = " + test(1,0));
   }
}

L'exécution du main de cette classe affiche :

on est dans le try
on est dans le catch
/ by zero
Valeur de z = 1
on est dans le finally
Résultat = 1

Q: Quelle est la différence entre surcharge et redéfinition ?

  • la surcharge (ou overloading) consiste à définir une méthode ayant même nom de fonction, même retour, paramètres différents d'une méthode existante dans la classe elle-même ou une super-classe (voir le tutorial officiel).
  • la redéfinition (ou overriding) consiste à définir une méthode ayant même nom, même retour, mêmes paramètres, visibilité potentiellement restreinte, et traitement différent d'une méthode existant dans une super-classe (voir le tutorial officiel).

On parle donc de surcharge sans forcément avoir d'héritage, contrairement à la redéfinition qui n'a de sens que pour une méthode héritée d'une super-classe.


Gauthier Picard