Integer i = ...
switch (i){
case null:
doSomething0();
break;
}
En el código anterior, no puedo usar nulo en la declaración de cambio de caso. ¿Cómo puedo hacer esto de manera diferente? No puedo usar default
porque quiero hacer otra cosa.
java
switch-statement
hudi
fuente
fuente
Respuestas:
Esto no es posible con una
switch
declaración en Java. Consultenull
antes deswitch
:No puede usar objetos arbitrarios en las
switch
declaraciones * . La razón por la que el compilador no se queja deswitch (i)
dóndei
es unInteger
es porque Java desempaqueta automáticamenteInteger
a unint
. Como ya dijo asilias, el unboxing arrojará unNullPointerException
cuándoi
esnull
.* Desde Java 7 puede usar
String
enswitch
declaraciones.Más información
switch
(incluido el ejemplo con variable nula) en Oracle Docs - Switchfuente
null
no pueda ser un caso válido cuando se trabaja conString
yenum
tipos. Quizás laenum
implementación se basa en llamarordinal()
detrás de escena (aunque aún así, ¿por qué no tratarnull
como si tuviera un 'ordinal' de -1?), Y laString
versión hace algo usandointern()
una comparación de puntero (o de lo contrario se basa en algo que estrictamente requiere desreferenciar un objeto)?fuente
switch(i)
lanzará una NullPointerException si lo esnull
, porque intentará desempaquetarInteger
en unint
. Entoncescase null
, lo que resulta ser ilegal, nunca habría sido alcanzado de todos modos.Debe verificar que no sea nulo antes de la
switch
declaración.fuente
Los documentos de Java declararon claramente que:
La prohibición de usar nulo como etiqueta de interruptor evita que uno escriba código que nunca se puede ejecutar. Si la expresión de cambio es de un tipo de referencia, como un tipo primitivo en caja o una enumeración, se producirá un error en tiempo de ejecución si la expresión se evalúa como nula en tiempo de ejecución.
Debe tener que verificar nulo antes de la ejecución de la declaración Swithch.
Ver la declaración de cambio
fuente
Dado:
Para mí, esto generalmente se alinea con una tabla de búsqueda en una base de datos (solo para tablas que rara vez se actualizan).
Sin embargo, cuando trato de usar
findByTypeId
en una declaración de cambio (de, muy probablemente, la entrada del usuario) ...... como han dicho otros, esto da como resultado un NPE @
switch(personType) {
. Una solución alternativa (es decir, "solución") que comencé a implementar fue agregar unUNKNOWN(-1)
tipo.Ahora, no tiene que hacer una verificación nula donde cuenta y puede elegir manejar o no los
UNKNOWN
tipos. (NOTA:-1
es un identificador poco probable en un escenario empresarial, pero obviamente elige algo que tenga sentido para su caso de uso).fuente
UNKNOWN
es la mejor solución que he visto en mi vida y supero los nullchecks.Tienes que hacer un
fuente
Algunas bibliotecas intentan ofrecer alternativas a la
switch
declaración integrada de Java . Vavr es uno de ellos, lo generalizan a la coincidencia de patrones.Aquí hay un ejemplo de su documentación :
Puede usar cualquier predicado, pero ofrecen muchos de ellos listos para usar, y
$(null)
es perfectamente legal. Me parece una solución más elegante que las alternativas, pero esto requiere java8 y una dependencia de la biblioteca vavr ...fuente
También puedes usar
String.valueOf((Object) nullableString)
comofuente
fuente
No puedes Puede usar primitivas (int, char, short, byte) y String (Strings en java 7 solamente) en el switch. Las primitivas no pueden ser nulas.
Compruebe
i
en condiciones separadas antes del interruptor.fuente
Solo considere cómo podría funcionar el INTERRUPTOR,
fuente
Basado en la respuesta @tetsuo, con java 8:
fuente