Qual é a melhor maneira de se proteger contra nulo em um loop for em Java?
Isso parece feio:
if (someList != null) {
for (Object object : someList) {
// do whatever
}
}
Ou
if (someList == null) {
return; // Or throw ex
}
for (Object object : someList) {
// do whatever
}
Pode não haver outra maneira. Eles deveriam colocá-lo na for
própria construção, se for nulo, não execute o loop?
null
não é o mesmo que uma coleção vazia.Respostas:
Você deve verificar melhor de onde você obtém essa lista.
Uma lista vazia é tudo que você precisa, porque uma lista vazia não falhará.
Se você obtiver essa lista de outro lugar e não souber se está tudo bem ou não, você poderá criar um método utilitário e usá-lo desta forma:
E, claro,
safe
seria:fonte
emptyList
java.sun.com/j2se/1.5.0/docs/api/java/util/… O que é o IIRC?Você poderia escrever um método auxiliar que retornasse uma sequência vazia se passasse nulo:
Então use:
Eu acho que realmente não faria isso - normalmente usaria seu segundo formulário. Em particular, o "or throw ex" é importante - se realmente não deve ser nulo, você definitivamente deve lançar uma exceção. Você sabe que algo deu errado, mas você não sabe a extensão do dano. Abortar cedo.
fonte
emptyIfNull
éIterable<T>
: existe oremove
método infelizIterator<T>
, mas esse é o único aspecto mutável (e se você tem uma coleção vazia, por que está tentando remover algo dela?) Não está claro o que você ' está objetando aqui.Já é 2017, e agora você pode usar Apache Commons Collections4
O uso:
Você pode fazer a mesma verificação de segurança nula para outras classes de coleção com
CollectionUtils.emptyIfNull
.fonte
Collections.emptyList()
internamente, que por sua vez sempre retorna a mesma lista não modificável vazia pré-alocada.Com o Java 8
Optional
:fonte
someList != null ? someList : Collections.emptyList()
e também cria e imediatamente joga fora uma instância deOptional
objeto.Use
ArrayUtils.nullToEmpty
dacommons-lang
biblioteca para matrizesEssa funcionalidade existe na
commons-lang
biblioteca, incluída na maioria dos projetos Java.É o mesmo que a resposta dada por @OscarRyz, mas, pelo bem do mantra DRY , acredito que vale a pena notar. Veja a página do projeto commons-lang . Aqui está a documentação e a fonte da
nullToEmpty
APIEntrada do Maven para incluir
commons-lang
no seu projeto, se ainda não estiver.Infelizmente,
commons-lang
não fornece essa funcionalidade paraList
tipos. Nesse caso, você precisaria usar um método auxiliar, como mencionado anteriormente.fonte
Se você está obtendo isso
List
de uma chamada de método implementada, não retornenull
, retorne uma mensagem vazia.List
.Se você não puder alterar a implementação, ficará com a
null
verificação. Se não fornull
, lance uma exceção.Eu não usaria o método helper que retorna uma lista vazia porque pode ser útil algumas vezes, mas você se acostumaria a chamá-lo em todos os ciclos que você possivelmente ocultar alguns erros.
fonte
Modifiquei a resposta acima, para que você não precise transmitir do Object
e, em seguida, basta chamar a lista
Explicação: MyOwnObject: Se,
List<Integer>
então, MyOwnObject será Inteiro neste caso.fonte
Outra maneira de se proteger efetivamente contra um nulo em um loop for é agrupar sua coleção com o Google Guava,
Optional<T>
pois isso, espera-se, torna clara a possibilidade de uma coleção efetivamente vazia, pois é esperado que o cliente verifique se a coleção está presenteOptional.isPresent()
.fonte
Para quem não estiver interessado em escrever seu próprio método estático de segurança nula, você pode usar: commons-lang's
org.apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object)
. Por exemplo:ObjectUtils.defaultIfNull JavaDoc
fonte
Use,
CollectionUtils.isEmpty(Collection coll)
método que é Null-safe verifique se a coleção especificada está vazia.por isso
import org.apache.commons.collections.CollectionUtils
.Dependência do Maven
fonte
fonte