Comme damryfbfnetsi remarquer dans les commentaires, JLS §14.11 a la note suivante:
L'interdiction d'utiliser, null
comme un interrupteur étiquette empêche d'écrire du code qui ne peut jamais être exécutée. Si l' switch
expression est d'un type de référence, qui est, String
ou d'une boîte de type primitif ou d'un type d'énumération, alors une erreur d'exécution se produit si l'expression est évaluée à null
au moment de l'exécution. Dans le jugement des concepteurs du langage de programmation Java, c'est un meilleur résultat que silencieusement le saut de l'ensemble de l' switch
déclaration ou de choisir d'exécuter les instructions (le cas échéant) après l' default
de l'étiquette (le cas échéant).
(l'emphase est mienne)
Alors que la dernière phrase saute au-dessus de la possibilité d'utiliser case null:
, il semble raisonnable et offre une vue sur la langue des designers intentions.
Si nous plutôt un regard sur les détails de mise en œuvre, ce blog de Christian Hujer a quelques perspicace les spéculations sur les raisons null
n'est pas autorisé dans les commutateurs (bien qu'il se concentre sur enum
commutateurs plutôt que pour l' String
s):
Sous le capot, l' switch
déclaration généralement les compiler en un tablesswitch de byte code. Et le "physique" argument switch
ainsi que ses affaires sont int
s. L'int de la valeur de l'interrupteur est déterminé par l'invocation de la méthode de Enum.ordinal()
. [...] Les ordinaux commencer à zéro.
Cela signifie que, cartographie, null
de 0
ne serait pas une bonne idée. Un interrupteur sur la première valeur d'énumération serait indistinguishible de null. Peut-être que ça aurait été une bonne idée de commencer à compter les ordinaux pour les enums à 1. Cependant, il n'a pas été définie comme ça, et cette définition ne peut pas être changé.
Alors qu' String
commutateurs sont mis en œuvre différemment, l' enum
interrupteur est venu en premier et créé un précédent pour comment le fait de passer sur un type de référence doit se comporter lorsque la référence est - null
.