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 defaultporque quiero hacer otra cosa.
                    
                        java
                                switch-statement
                                
                    
                    
                        hudi
fuente
                
                fuente

Respuestas:
Esto no es posible con una
switchdeclaración en Java. Consultenullantes deswitch:No puede usar objetos arbitrarios en las
switchdeclaraciones * . La razón por la que el compilador no se queja deswitch (i)dóndeies unIntegeres porque Java desempaqueta automáticamenteIntegera unint. Como ya dijo asilias, el unboxing arrojará unNullPointerExceptioncuándoiesnull.* Desde Java 7 puede usar
Stringenswitchdeclaraciones.Más información
switch(incluido el ejemplo con variable nula) en Oracle Docs - Switchfuente
nullno pueda ser un caso válido cuando se trabaja conStringyenumtipos. Quizás laenumimplementación se basa en llamarordinal()detrás de escena (aunque aún así, ¿por qué no tratarnullcomo si tuviera un 'ordinal' de -1?), Y laStringversió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á desempaquetarIntegeren 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
switchdeclaració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
findByTypeIden 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
UNKNOWNtipos. (NOTA:-1es un identificador poco probable en un escenario empresarial, pero obviamente elige algo que tenga sentido para su caso de uso).fuente
UNKNOWNes 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
switchdeclaració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
ien 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