Comment faire pour utiliser la valeur null dans le commutateur
Integer i = ...
switch (i){
case null:
doSomething0();
break;
}
Dans le code ci-dessus je ne peux pas utiliser la valeur null dans le commutateur de cas. Comment puis-je faire autrement?
Je ne peux pas utiliser default
parce que je veux faire autre chose.
- avant de basculer vérifier la nullité de la condition if(i==null) {//dosomething}
- Ce serait effectivement faire le commutateur utile. D'autres filtrage des langues de travail de cette façon.
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas possible avec un
switch
déclaration en Java. Vérifiernull
avant laswitch
:Vous ne pouvez pas utiliser des objets arbitraires dans la
switch
consolidés*. La raison que le compilateur ne se plaignent passwitch (i)
oùi
est unInteger
est parce que Java auto-unboxes laInteger
à unint
. Comme assylias déjà dit, l'unboxing va jeter unNullPointerException
quandi
estnull
.* Depuis Java 7, vous pouvez utiliser
String
dansswitch
consolidés.Plus sur
switch
(y compris exemple avec une variable de type null) dans Oracle Docs - Commutateurnull
ne peut pas être un cas valide lorsque l'on travaille avecString
etenum
types. Peut-être leenum
mise en œuvre s'appuie sur l'appel deordinal()
derrière les scènes (bien que, même alors, pourquoi ne pas traiternull
comme ayant un "ordinal" de -1?), et leString
version fait quelque chose à l'aide deintern()
et pointeur-comparaison (ou sinon s'appuie sur quelque chose que strictement nécessite référence à un objet)?switch(i)
va lancer une exception NullPointerException si i estnull
, car il va essayer de unbox laInteger
dans unint
. Donccase null
, qui se trouve être illégale, n'aurait jamais été atteint de toute façon.Vous avez besoin pour vérifier que je n'est pas null avant de l'
switch
déclaration.Java docs clairement indiqué que:
À l'interdiction d'utiliser la valeur null comme un interrupteur étiquette empêche d'écrire du code qui ne peut jamais être exécutée. Si le commutateur d'expression est d'un type référence, comme une boîte de type primitif ou d'un enum, une erreur d'exécution se produit si l'expression a la valeur null au moment de l'exécution.
Vous devez avoir à vérifier la valeur null avant d'Swithch l'exécution de l'instruction.
Voir L'Instruction Switch
Donné:
Pour moi, cela s'aligne avec un look-up table dans une base de données (pour rarement-mise à jour des tables seulement).
Cependant, lorsque j'essaie d'utiliser
findByTypeId
dans une instruction switch (à partir de la, le plus probable, la saisie de l'utilisateur)......comme d'autres l'ont dit, il en résulte une NPE @
switch(personType) {
. Une façon de contourner (c'est à dire, "solution"), j'ai commencé à mettre en œuvre était d'ajouter uneUNKNOWN(-1)
type.Maintenant, vous n'avez pas à faire null-vérification de la où il le faut et vous pouvez choisir, ou non, de la poignée
UNKNOWN
types. (NOTE:-1
est peu probable que l'identificateur dans un scénario d'entreprise, mais bien évidemment choisir quelque chose qui fait sens pour votre cas d'utilisation).UNKNOWN
est la meilleure solution sur ce que j'ai jamais vu et overcomse nullchecks.Vous devez faire un
Certaines bibliothèques offrir des alternatives à la builtin java
switch
déclaration. Vavr est l'un d'entre eux, ils généraliser ce modèle à la correspondance.Voici un exemple de leur documentation:
Vous pouvez utiliser n'importe quel prédicat, mais ils offrent beaucoup d'entre eux hors de la boîte, et
$(null)
est parfaitement légal. Je trouve cette solution plus élégante que les autres, mais cela nécessite de java8 et une dépendance sur le vavr bibliothèque...Vous pouvez également utiliser
String.valueOf((Object) nullableString)
comme
Vous ne pouvez pas. Vous pouvez utiliser primitifs (int, char, short, byte) et Chaîne (Chaînes de caractères en java 7 uniquement) dans le commutateur. les primitives ne peut pas être null.
Vérifier
i
en condition distincte avant de basculer.Il suffit de considérer comment le COMMUTATEUR peut fonctionner,
Donc, compte tenu de l'absence d'une méthode peut être appelée sur un nul, commutateur cant gérer la valeur null.