23/06/2010

Questions pièges Java n°5

Question 5 :
Dans le programme suivant quelles sont les lignes de codes qui génèrent une erreur de compilation :

class AClass {
public static void main() {
Byte B1 = 2;
Byte B2 = 200;
Long L = 2;
Number N = 2;
Object O = 2;
}
}

16/06/2010

Questions pièges Java n°5 : réponse

Code :

class AClass {
public static void main() {
Byte B1 = 2;
Byte B2 = 200;
Long L = 2;
Number N = 2;
Object O = 2;
}
}


Réponse
Les trois premières lignes du corps de la fonction main sont incorrectes

Explication
La première ligne est incorrecte car :
- on ne peut pas Boxer un int en Byte, on ne peut que le boxer en Integer
- il n'existe pas de conversion de Byte en Integer
- il n'existe pas d'enchainement de conversion implicite qui commençe par caster un int en byte puis qui le boxe en Byte

Ceci n'a rien à voir avec la valeur contenue dans le Byte. La ligne 4 est donc tout aussi incorrecte.

Cela n'a rien à voir non plus avec le fait que le byte soit plus "étroit" que le int. La ligne 5 est incorrecte pour exactement les mêmes raisons.

Les lignes 6 et 7 sont correctes. Il s'agit d'un enchainement de conversions :
- Boxing (int -> Integer)
- Widening reference (Integer ->Number) ou (Integer -> Object)


Point théorique associé
ici

31/05/2010

Point théorique Java : Assert

- l'activation des asserts se fait au moment du lancement d'un programme en utilisant le paramètre -ea (pour enable assertion)

- Lorsque les assertions sont désactivées, les expressions passées aux asserts ne sont pas évaluées


...
int i = 0;
assert (i=4)==4;
// ici i vaut 4 si les assertions sont activées et 0 sinon
...


- Attention : ceci est un cas particulier très étrange :
Lorsque l'on utilise un objet avant d'avoir initialisé sa classe, il doit se comporter comme si les assertions étaient actives.

class P{
static {Q.method();}
}
class Q extends P{
static void method(){
int i = 0;
assert (i=4)==4;
System.out.println(i);
}
}

Ici l'initialisation de Q entraine celle de P qui appelle Q.method() qui est donc exécutée avant que Q soit initialisée.
Que les assertions soient activées ou non, le println affichera 4;