Puzzler
Puzzler C'est quoi un Puzzler ?
Modèle d'exécution Java Puzzler Modèle d'exécution Java
Puzzler Qu'affiche ce code ? public class Parsing { /** * Returns Integer corresponding to s, or null if s is null. * @throws NumberFormatExceptionif s is non null and * doesn't represent a valid integer */ public static Integer parseInt(String s) { return (s==null)?(Integer)null:Integer.parseInt(s); } public static void main(String[] args) { System.out.println(parseInt("-1") + " " + parseInt(null) + " " + parseInt("1"));
Puzzler - Réponse NPE car null est un Integer et Integer.parseInt() renvoie un int donc il y a un auto-unboxing de null. public class Parsing { public static Integer parseInt(String s) { return (s==null)?(Integer)null:Integer.parseInt(s); } public static void main(String[] args) { System.out.println(parseInt("-1") + " " + parseInt(null) + " " + parseInt("1"));
Puzzler - Fix Evitez de mixer type primitif et wrapper, surtout avec ?: Attention au boxing/unboxing de null public class Parsing { public static Integer parseInt(String s) { return (s==null)?null:Integer.valueOf(s); } public static void main(String[] args) { System.out.println(parseInt("-1") + " " + parseInt(null) + " " + parseInt("1"));
Puzzler Qu'affiche ce code ? public class Parsing { /** * Returns Integer corresponding to s, or null if s is null. * @throws NumberFormatExceptionif s is non null and * doesn't represent a valid integer */ public static Integer parseInt(String s) { return (s==null)?(Integer)null:Integer.parseInt(s); } public static void main(String[] args) { System.out.println(parseInt("-1") + " " + parseInt(null) + " " + parseInt("1"));
Puzzler - Réponse NPE car null est un Integer et Integer.parseInt() renvoie un int donc il y a un auto-unboxing de null. public class Parsing { public static Integer parseInt(String s) { return (s==null)?(Integer)null:Integer.parseInt(s); } public static void main(String[] args) { System.out.println(parseInt("-1") + " " + parseInt(null) + " " + parseInt("1"));
Puzzler - Fix Evitez de mixer type primitif et wrapper, surtout avec ?: Attention au boxing/unboxing de null public class Parsing { public static Integer parseInt(String s) { return (s==null)?null:Integer.valueOf(s); } public static void main(String[] args) { System.out.println(parseInt("-1") + " " + parseInt(null) + " " + parseInt("1"));
Puzzler Qu'affiche ce code ? public class BeyondCompare{ public static void main(String[] args) { Object o=3; System.out.println(new Double(3).compareTo(o)==0); }
Puzzler - Réponse Il compile en 1.4 (mais CCE à l'exécution) mais pas en 1.5 !! Comparable indique avec quoi comparé Et Double est définie comme ceci : public interface Comparable<T> { int compareTo(T t); // avant c'était Object } public class Double extends Number implements Comparable<Double> { ... }
Puzzler - Fix Il faut utiliser un Double : Et donc comparer les Double entre eux Normalement, la compatibilité binaire est assurée, ici non car cela permet de détecter une CCE à la compilation public class BeyondCompare{ public static void main(String[] args) { Double o=3; System.out.println(Double.valueOf(3).compareTo(o)==0); }
Puzzler Qu'affiche ce code ? public class Fibonacci { private static final int LENGTH=7; public static void main(String[] args) { int[] fib=new int[LENGTH]; fib[0]=fib[1]= 1; // First 2 Fibonacci numbers for (int i=2; i<fib.length;i++) fib[i]=fib[i -2]+fib[i -1]; System.out.println(Arrays.asList(fib)); }
Puzzler - Réponse Une valeur de hachage [[I@ad3ba4 Arrays.asList(T...) prend un tableau d'objet pas un tableau de type primitif !! public class Fibonacci { private static final int LENGTH=7; public static void main(String[] args) { int[] fib=new int[LENGTH]; fib[0]=fib[1]= 1; // First 2 Fibonacci numbers for (int i=2; i<fib.length;i++) fib[i]=fib[i -2]+fib[i -1]; System.out.println(Arrays.asList(fib)); }
Puzzler - Fix Integer != int Ne pas utiliser Arrays.asList() juste popur faire l'affichage, utiliser Arrays.toString() !! public class Fibonacci { private static final int LENGTH=7; public static void main(String[] args) { int[] fib=new int[LENGTH]; fib[0]=fib[1]= 1; // First 2 Fibonacci numbers for (int i=2; i<fib.length;i++) fib[i]=fib[i -2]+fib[i -1]; System.out.println(Arrays.toString(fib)); }