C'est un bug. Voici le comportement spécifié pour un switch
déclaration selon la Java Language Specification, 3ème Édition:
SwitchStatement:
switch ( Expression ) SwitchBlock
Lorsque l' switch
instruction est exécutée, le premier Expression
est évaluée. Si l' Expression
évalue null
, un NullPointerException
est levée et l'ensemble de l' switch
instruction se termine brusquement pour cette raison.
Apparemment le bug dans Eclipse n'a rien à voir avec default
cas ou enum
à tous.
public class SwitchingOnAnull {
public static void main(String[] args) {
java.math.RoundingMode x = null;
switch(x) {};
switch((Integer) null) {};
switch((Character) null) {
default: System.out.println("I've got sunshine!");
}
}
}
Le code ci-dessus compile et s'exécute "fine" sur (au moins une version de) Eclipse. Chaque individu, switch
jette un NullPointerException
lorsqu'il est compilé avec javac
, ce qui est exactement comme la spécification des mandats.
La cause
Voici javap -c SwitchingOnAnull
lors de la compilation sous Eclipse:
Compiled from "SwitchingOnAnull.java"
public class SwitchingOnAnull extends java.lang.Object{
public SwitchingOnAnull();
Code:
0: aload_0
1: invokespecial #8; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: aconst_null
1: astore_1
2: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream;
5: ldc #22; //String I've got sunshine!
7: invokevirtual #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: return
}
Il semble que le compilateur Eclipse se débarrasser de l'ensemble de l' switch
des constructions entièrement. Malheureusement, cette optimisation des sauts de la spécification du langage.
L'officiel des mots
Le bug a été déposée, et attribué pour la fixer.
Olivier Thomann 2010-05-28 08:37:21 HAE
Nous sommes trop agressif sur l'optimisation.
Pour:
switch((Integer) null) {};
nous optimisons l'ensemble de l' switch
déclaration, alors que nous devrions au moins évaluer les
de l'expression.
Je vais jeter un oeil.
Candidat pour 3.6.1.
Voir aussi