Hoje vou mostrar técnicas simples de como evitar NullPointerException em suas aplicações. Eles são fáceis de seguir, mas melhoram significativamente a confiabilidade e a qualidade do seu código. Além disso, na minha experiência, a primeira dica terá um impacto perceptível na qualidade do seu código. Se você conhece algum outro truque de programação Java, sinta-se à vontade para compartilhá-lo nos comentários.
Use
Existem muitas bibliotecas de código aberto que assumem a pesada carga de testes do Tente não retornar
Esta é outra boa dica de programação Java que Joshua Bloch descreve em seu livro Java: Effective Programming. Ao retornar coleções ou matrizes vazias, certifique-se de que chamar métodos base goste
Chame os métodos equals() e equalsIgnoreCase() em uma string literal conhecida em vez de um objeto desconhecido
Sempre chame um métodoequals()
em uma string conhecida que você sabe que não é null
. O método equals()
é simétrico, ou seja, chama a.equals(b)
e b.equals(a)
dará o mesmo resultado (if a
e b
not null
), e por isso muitos programadores não prestam atenção em quais objetos são chamados equals()
, y a
ou y b
. Um dos efeitos colaterais disso é um NullPointerException se o método for chamado null
.
Object unknownObject = null;
//плохой способ - может вызвать NullPointerException
if(unknownObject.equals("knownObject")){
System.err.println("This may result in NullPointerException if unknownObject is null");
}
//правильный способ - исключение NullPointerException не возникнет, даже если unknownObject null
if("knownObject".equals(unknownObject)){
System.err.println("better coding avoided NullPointerException");
}
Essa foi a dica mais simples para evitar NullPointerException, mas por si só já representa uma grande melhoria porque o método equals()
é encontrado em todos os lugares.
Escolha valueOf() em vez de toString() nos casos em que ambos produzem o mesmo resultado
Como chamartoString()
uma referência com um valor null
gera uma NullPointerException, é melhor usar call valueOf()
quando pudermos obter o mesmo resultado, já que chamar valueOf()
from null
return null
. Isso é especialmente verdadeiro para classes wrapper como Integer
, Float
, Double
ou BigDecimal
.
BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //не выбрасывает NPE
System.out.println(bd.toString()); //выбрасывает "Exception in thread "main" java.lang.NullPointerException"
Use essas dicas quando não tiver certeza se um objeto pode existir null
ou não.
Use null
métodos e bibliotecas -safe
Existem muitas bibliotecas de código aberto que assumem a pesada carga de testes do null
. Um dos mais comuns é StringUtils
do Apache Commons. Usando métodos como StringUtils.isBlank()
, isNumeric()
, isWhiteSpace()
etc. você não precisa se preocupar em lançar um NullPointerException.
//Методы StringUtils являются null-безопасными, они не вызовут NullPointerException
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));
Saída: verdadeiro verdadeiro falso falso E ainda assim, antes de usar, não esqueça de ler a documentação null
de métodos e classes seguros. Este é outro dos melhores truques do Java que leva a grandes melhorias sem exigir muito esforço.
Tente não retornar null
de um método, é melhor retornar uma coleção vazia
Esta é outra boa dica de programação Java que Joshua Bloch descreve em seu livro Java: Effective Programming. Ao retornar coleções ou matrizes vazias, certifique-se de que chamar métodos base goste size()
ou length()
não de lançar uma NullPointerException. A classe Collections
declara especificamente implementações convenientes de listas, conjuntos e dicionários vazios Collections.EMPTY_LIST
: Collections.EMPTY_SET
e Collections.EMPTY_MAP
. Por exemplo:
public List getOrders(Customer customer){
List result = Collections.EMPTY_LIST;
return result;
}
Da mesma forma, você pode usá Collections.EMPTY_SET
-lo Collections.EMPTY_MAP
em vez de retornar null
.
Use anotações @NotNull e @Nullable
Na descrição dos seus métodos, você pode definirnull
convenções de segurança do método usando anotações @NotNull
e @Nullable para indicar se um método pode retornar null
ou não. Compiladores e IDEs modernos podem usar essas anotações para analisar seu código e fornecer conselhos apropriados, por exemplo, sobre a falta de uma verificação de null
, ou vice-versa, sobre a possibilidade de remover uma verificação desnecessária que está obstruindo o código. Tais anotações, por exemplo, são suportadas pelo IDE IntelliJ e FindBugs, e também estão incluídas no JSR 305. Mas mesmo que o seu IDE não suporte tais anotações, elas serão uma boa documentação por si só. Olhando @NotNull
e @Nullable
será mais fácil para o programador entender onde adicionar um cheque null
e onde não. A propósito, essa é uma prática relativamente nova entre os programadores Java e levará algum tempo para se espalhar.
Evite autoboxing e autounboxing desnecessários em seu código
Isso não apenas leva à criação de objetos temporários desnecessários, mas o autoboxing também pode gerar uma NullPointerException se a classe wrapper fornull
. Por exemplo, o código a seguir lançará uma NullPointerException se a entrada da pessoa não contiver um número de telefone e retornar null
.
Person ram = new Person("ram");
int phone = ram.getPhone();
Ao usar autoboxing ou autounboxing, não apenas igualdades, mas também desigualdades <
> >
podem resultar em uma NullPointerException.
Siga as convenções e defina padrões razoáveis.
Uma das melhores maneiras de evitar NullPointerException em Java é declarar e seguir adequadamente as convenções de codificação. A maioria das NullPointerExceptions ocorre quando você tenta criar um objeto sem ter todos os dados e dependências necessários. Ao evitar a criação de objetos inacabados, rejeitando normalmente tais solicitações, você se salvará de um grande número de NullPointerExceptions no futuro. Da mesma forma, se você permitir a criação de objetos, deverá escolher um valor padrão razoável. Por exemplo, um objeto de classeEmployee
não pode ser criado sem um nome e id
, mas pode não ter um número de telefone. Nesse caso, objetos Employee
sem número podem retornar zero null
. Embora tal comportamento do objeto deva ser pensado com antecedência - pode ser mais fácil verificar null
do que ligar para um número inexistente. Nesse caso, ter condições adicionais sobre quais campos são null
e quais não são ajudará a tomar a decisão certa. Em geral, a escolha entre travar imediatamente o programa ou atribuí- null
lo é uma decisão importante de design e, depois de fazer a escolha, você deve segui-la de forma consistente.
Definir restrições no nível do DBMS
Ao usar um banco de dados para armazenar seus objetos de programa, como Clientes ou Pedidos, é aconselhável especificar a "null
ness" de seus objetos no nível do SGBD, usando restrições de tabela apropriadas. Os bancos de dados geralmente contêm informações de várias fontes, e a introdução de verificações de valores ausentes melhorará a integridade dos seus dados. Além disso, a presença de verificações de null no nível do SGBD irá reduzi-las em seu código Java: ao carregar dados do banco de dados em objetos Java, você pode ter certeza de sua presença e remover "" desnecessários != null
do código do programa.
Use o padrão de objeto nulo
CriarNull
objetos especiais é outra maneira de evitar NullPointerExcpetion em Java. Vamos supor que algum método em nosso aplicativo retorne um objeto com o qual o programa trabalhará posteriormente, chamando seus métodos. Por exemplo, o método Collection.iterator()
retorna um objeto da classe Iterator
que é usado para iterar pela coleção. Então, se o objeto original não tiver nenhum iterador, null
você poderá retornar um Null
objeto especial que possui um método hasNext()
que sempre retorna false
. Isso é tudo, caro leitor, é aqui que termino minhas dicas para livrar programas Java de erros de NullPointerException. Você apreciará o quão úteis essas regras simples e não pesadas podem ser. Como lembrete, se você quiser compartilhar quaisquer outros truques de NullPointerException em programas Java, sinta-se à vontade para fazê-lo nos comentários. Traduzido especificamente para alunos JavaRush. Original
GO TO FULL VERSION