Integer i = ...
switch (i){
case null:
doSomething0();
break;
}
No código acima, não posso usar null na instrução switch case. Como posso fazer isso de maneira diferente? Não posso usar default
porque então quero fazer outra coisa.
java
switch-statement
hudi
fonte
fonte
Respostas:
Isso não é possível com uma
switch
instrução em Java. Verifiquenull
antes deswitch
:Você não pode usar objetos arbitrários nas
switch
instruções * . O motivo pelo qual o compilador não se queixa sobreswitch (i)
ondei
está umInteger
é porque o Java descompacta automaticamente o arquivoInteger
para umint
. Como assylias já disse, o unboxing vai lançar umNullPointerException
quandoi
énull
.* Desde o Java 7, você pode usar
String
emswitch
declarações.Mais informações sobre
switch
(incluindo exemplo com variável nula) no Oracle Docs - Switchfonte
null
não possa ser um caso válido ao trabalhar comString
eenum
tipos. Talvez aenum
implementação se baseie em chamarordinal()
os bastidores (embora, ainda assim, por que não tratarnull
como tendo um 'ordinal' de -1?), E aString
versão faça algo usandointern()
uma comparação de ponteiro (ou se baseie em algo que exija estritamente a exclusão de uma referência objeto)?fonte
switch(i)
lançará uma NullPointerException se fornull
, porque tentará descompactar o arquivoInteger
em umint
. Entãocase null
, o que é ilegal, nunca teria sido alcançado.Você precisa verificar se i não é nulo antes da
switch
declaração.fonte
Os documentos Java declararam claramente que:
A proibição de usar null como um rótulo de opção impede que alguém escreva um código que nunca pode ser executado. Se a expressão da opção for de um tipo de referência, como um tipo primitivo em caixa ou uma enumeração, ocorrerá um erro em tempo de execução se a expressão for avaliada como nula no tempo de execução.
Você deve verificar se há nulo antes da execução da instrução Swithch.
Veja a declaração Switch
fonte
Dado:
Para mim, isso normalmente está alinhado com uma tabela de pesquisa em um banco de dados (apenas para tabelas raramente atualizadas).
No entanto, quando tento usar
findByTypeId
em uma instrução switch (da entrada do usuário mais provável) ...... como outros já declararam, isso resulta em um NPE @
switch(personType) {
. Uma solução alternativa (isto é, "solução") que comecei a implementar foi adicionar umUNKNOWN(-1)
tipo.Agora, você não precisa fazer a verificação nula onde é importante e pode optar por, ou não, manipular os
UNKNOWN
tipos. (NOTA:-1
é um identificador improvável em um cenário de negócios, mas obviamente escolha algo que faça sentido para o seu caso de uso).fonte
UNKNOWN
é a melhor solução sobre isso que eu já vi e supera as verificações nulas.Você tem que fazer uma
fonte
Algumas bibliotecas tentam oferecer alternativas à
switch
instrução java embutida . O Vavr é um deles, eles o generalizam para a correspondência de padrões.Aqui está um exemplo de sua documentação :
Você pode usar qualquer predicado, mas eles oferecem muitos deles imediatamente e
$(null)
é perfeitamente legal. Acho isso uma solução mais elegante do que as alternativas, mas isso requer java8 e uma dependência da biblioteca vavr ...fonte
Você também pode usar
String.valueOf((Object) nullableString)
comofonte
fonte
Você não pode. Você pode usar primitivas (int, char, short, byte) e String (Strings apenas no java 7) no switch. primitivas não podem ser nulas.
Verifique
i
em condições separadas antes de trocar.fonte
Considere como o SWITCH pode funcionar,
fonte
Com base na resposta @tetsuo, com java 8:
fonte