31 votes

Bug Eclipse? Activer une valeur nulle avec uniquement un cas par défaut

J'expérimentais avec enum , et j'ai trouvé que ce qui suit se compile et fonctionne correctement sur Eclipse (ID de build: 20090920-1017, pas sûr de la version exacte du compilateur):

 public class SwitchingOnAnull {
    enum X { ,; }
    public static void main(String[] args) {
        X x = null;
        switch(x) {
            default: System.out.println("Hello world!");
        }
    }
}
 

Une fois compilé et exécuté avec Eclipse, cela affiche "Hello world!" et se termine normalement.

Avec le compilateur javac , cela génère un NullPointerException comme prévu.

Y a-t-il donc un bogue dans le compilateur Java Eclipse?

27voto

polygenelubricants Points 136838

C'est un bug. Voici le comportement spécifié pour un switch déclaration selon la Java Language Specification, 3ème Édition:

JLS Le 14.11 switch Déclaration

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

4voto

Andreas_D Points 64111

Electrique. Si l'on regarde le chapitre 14.11 de la java language specification, il indique clairement (en vertu de la "discussion"):

L'interdiction d'utiliser la valeur null comme un commutateur étiquette empêche de écrire du code qui ne peut jamais être exécutée. Si le commutateur d'expression est d'un type de référence, comme une boîte type primitif ou d'un enum, au moment de l'exécution erreur se produit si l'expression renvoie la valeur null au moment de l'exécution.

1voto

aioobe Points 158466

Oui. Selon le JLS, c'est un bug:

Si l'expression de commutateur est d'un type de référence, tel qu'un type primitif encadré ou une énumération, une erreur d'exécution se produit si l'expression est évaluée à null au moment de l'exécution.

-3voto

yoav.str Points 296

ce n'est pas eclipse jave (1.6 au moins)

 switch (1.$SwitchMap$com$fullpath$nameOfMethod[Enum.ordinal()])
 

ici U effondrement couse null n'a pas d'ordinal ....

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X