Integer i = ...
switch (i){
case null:
doSomething0();
break;
}
Dans le code ci-dessus, je ne peux pas utiliser null dans l'instruction switch case. Comment puis-je procéder différemment? Je ne peux pas utiliser default
car je veux faire autre chose.
Réponses:
Ce n'est pas possible avec une
switch
instruction en Java. Vérifieznull
avantswitch
:Vous ne pouvez pas utiliser d'objets arbitraires dans les
switch
instructions * . La raison pour laquelle le compilateur ne se plaint pas de l'switch (i)
emplacement d'i
unInteger
est parce que Java décompresse automatiquement le fichierInteger
vers un fichierint
. Comme l'a déjà dit assylias, le déballage va lancer unNullPointerException
quandi
estnull
.* Depuis Java 7 , vous pouvez utiliser
String
dans lesswitch
déclarations.En savoir plus sur
switch
(y compris l'exemple avec une variable nulle) dans Oracle Docs - Switchla source
null
ne peut pas être un cas valable lorsque vous travaillez avecString
etenum
types. Peut-être que l'enum
implémentation repose sur l'appelordinal()
en coulisses (même si, pourquoi ne pas traiternull
comme ayant un `` ordinal '' de -1?), Et laString
version fait quelque chose en utilisantintern()
et une comparaison de pointeurs (ou sinon s'appuie sur quelque chose qui nécessite strictement le déréférencement d'un objet)?la source
switch(i)
lancera une NullPointerException si je le suisnull
, car il essaiera de déballer leInteger
dans unint
. Donccase null
, ce qui se trouve être illégal, n'aurait jamais été atteint de toute façon.Vous devez vérifier que i n'est pas nul avant l'
switch
instruction.la source
Les documents Java ont clairement indiqué que:
L'interdiction d'utiliser null comme étiquette de commutateur empêche d'écrire du code qui ne peut jamais être exécuté. 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.
Vous devez vérifier la valeur null avant l'exécution de l'instruction Swithch.
Voir la déclaration Switch
la source
Donné:
Pour moi, cela correspond généralement à une table de recherche dans une base de données (pour les tables rarement mises à jour uniquement).
Cependant, lorsque j'essaie d'utiliser
findByTypeId
dans une instruction switch (à partir, probablement, d'une entrée utilisateur) ...... comme d'autres l'ont dit, cela se traduit par un NPE @
switch(personType) {
. Une solution de contournement (c'est-à-dire «solution») que j'ai commencé à implémenter consistait à ajouter unUNKNOWN(-1)
type.Désormais, vous n'avez plus à vérifier la valeur nulle là où cela compte et vous pouvez choisir de gérer ou non les
UNKNOWN
types. (REMARQUE:-1
est un identifiant improbable dans un scénario commercial, mais choisissez évidemment quelque chose qui a du sens pour votre cas d'utilisation).la source
UNKNOWN
est la meilleure solution à ce sujet que j'aie jamais vue et surmonter les vérifications nulles.Vous devez faire un
la source
Certaines bibliothèques tentent de proposer des alternatives à l'instruction Java intégrée
switch
. Vavr est l'un d'entre eux, ils le généralisent à la correspondance de motifs.Voici un exemple tiré de leur documentation :
Vous pouvez utiliser n'importe quel prédicat, mais ils en offrent beaucoup et
$(null)
sont parfaitement légaux. Je trouve cela une solution plus élégante que les alternatives, mais cela nécessite java8 et une dépendance à la bibliothèque vavr ...la source
Vous pouvez également utiliser
String.valueOf((Object) nullableString)
commela source
la source
Tu ne peux pas. Vous pouvez utiliser des primitives (int, char, short, byte) et String (Strings in java 7 only) dans switch. les primitives ne peuvent pas être nulles.
Vérifiez
i
dans un état séparé avant de passer.la source
Considérez simplement comment le SWITCH pourrait fonctionner,
la source
Basé sur la réponse @tetsuo, avec java 8:
la source