Академический Документы
Профессиональный Документы
Культура Документы
http://pt.stackoverflow.com/questions/63617/o-que-%C3%A9-anullpointerexception-e-quais-s%C3%A3o-suas-principais-causas
3.
Pessoa p = null;
String nome = p.nome; // <-- NullPointerException aqui.
4.
Pessoa p = null;
String nome = p.getNome(); // <-- NullPointerException aqui.
5.
Tentar usar autounboxing de null. Este daqui em especial tende a ser uma pegadinha
Integer x = null;
int z = x; // <-- NullPointerException aqui.
Outro exemplo:
Integer x = null;
int z = x + 5; // <-- NullPointerException aqui.
7.
Lanar o NullPointerException diretamente (bvio).
throw new NullPointerException();
8.
Tentar lanar null como exceo.
9.
Exception x = null;
throw x; // <-- NullPointerException aqui.
10.
11.
12.
Tentar acessar o tamanho de uma varivel array que tenha o valor null.
String[] x = null;
int tamanho = x.length; // <-- NullPointerException aqui.
Tentar acessar um elemento de uma varivel array que tenha o valor null.
13.
String[] x = null;
String y = x[5]; // <-- NullPointerException aqui.
14. Tentar iterar null usando a sintaxe do for-each.
15.
String[] x = null;
16.
for (String y : x) { // <-- NullPointerException aqui.
17.
// ...
}
18. Tentar sincronizar (com o bloco synchronized) em null.
19.
Object x = null;
20.
synchronized (x) { // <-- NullPointerException aqui.
21.
// ...
}
2.
6.
Entretanto, apesar disso ser vlido e at til em algumas vezes, importante se ter em
mente que esta situao ainda bem convidativa a eventuais NullPointerExceptions,
vez que normalmente no esperado que a varivel do lao possa ser null:
String[] x = new String {"a", "b", null, "c"};
for (String z : x) {
System.out.println(z.length()); // <-- NullPointerException aqui.
}
34. Acessar um campo ou mtodo esttico a partir de uma referncia null. Isso daqui
uma pegadinha da linguagem Java, pois neste caso a nica coisa que importa o tipo
da varivel, e no o valor.
35.
36.
Integer t = null;
t.parseInt("123"); // Pegadinha: t null, mas isso NO D
NullPointerException!
37.
System s = null;
Object x = s.out; // No d NullPointerException!
importante ressaltar tambm que usar uma varivel para acessar um mtodo esttico
uma m prtica de programao, pois deixa o cdigo confuso ao utilizar uma varivel
de forma desnecessria. No faa isso.
38.
39.
40.
Tentar utilizar uma varivel local no-inicializada ou potencialmente noinicializada. Isso daqui d erro de compilao, logo no d NullPointerException.
Pessoa p;
p.setNome("Maria"); // Erro de compilao, a varivel p no foi inicializada.
41.
42.
43.
Pessoa q;
if (x > y) q = new Pessoa(); // Pode inicializar ou no, dependendo da
condio do if.
q.setNome("Maria"); // Erro de compilao, a varivel q possivelmente no foi
inicializada.
Vale ressaltar que esta regra s vale para variveis locais dentro dos mtodos e
construtores. Ela NO se aplica a campos de objetos e variveis estticas.
44. Lembre-se que a referncia this nunca ser null. Portanto
um NullPointerException nunca ser causado devido a tentativa de manipular-se
campos e invocar mtodos no objeto this.
45. Um construtor nunca retorna null. Portanto, sempre que for atribudo a uma varivel
o resultado da chamada de um construtor, garantidamente o que ser atribuda ser algo
que no null. Logo, tomando como exemplo o cdigo abaixo, impossvel que a
varivel p receba null, independente do que estiver ocorrendo dentro do construtor.
46.
garantidamente no nulo.
47.
48.
49.
50.
51.
52.
53.
54.
Animal p = ...;
if (p instanceof Cachorro) {
// Se entrar aqui, alm de sabermos que p instncia de Cachorro,
// tambm sabemos que p no null.
55.
envolvendo referncias null desaparecerem, mas vai fazer eles se manifestarem mais
prximos de sua origem, tendo ento uma identificao mais fcil e portanto sendo mais
fceis de se rastrear e se corrigir. Alm disso, desta forma fica mais simples de garantir que
o seu mtodo est livre de erros, pois isso elimina uma categoria inteira de possveis erros
de programao que ele poderia ter e de brinde voc garante que ele no causar nenhum
efeito colateral estranho por ter executado apenas pela metade antes de ser abortado
pelo NullPointerException. A ideia que se o null estiver sendo usado de forma
inadequada (o que um erro de programao), ento o erro de programao no ser
responsabilidade do seu mtodo, e sim de quem o chamou de forma inadequada. Eis aqui
um exemplo simples:
public void cadastrarNome(String nome) {
if (nome == null) throw new NullPointerException("No pode cadastrar um nome
nulo.");
// ... Resto do mtodo.
}
"vazio", "no inicializado", "no se aplica", "no existe" ou "no encontrado". Nestes casos,
eis o que voc poderia fazer:
(Integer, Double, Long, etc.), talvez seja melhor retornar zero ao invs de null. E se
for o caso de retornar zero, mudar o tipo de retorno para o tipo primitivo, se possvel,
tambm seria uma boa ideia.
Caso o seu mtodo retorne um array, talvez seja melhor retornar um array de
tamanho zero ao invs de null.
Caso o seu mtodo retorne alguma coisa XYZ para a qual no h algo que represente
o "vazio", "no inicializado", "no se aplica", "no existe" ou "no encontrado", talvez
mudar o tipo de retorno para Optional<XYZ> seja uma boa ideia. Ou ento voc
poderia usar o padro de projetoNull Object (que eu explicarei um pouco abaixo).
Na prtica, podemos fazer algo assim:
public class MeuBean {
private String nome;
private List<Pessoa> pessoas;
// Outros mtodos...
public String getNome() {
return nome == null ? "" : nome;
}
E por sinal, voltando aos parmetros, podemos fazer algo parecido com os guardas. Ao
invs de apenas rejeitar os nulls com excees podemos substitu-los pelos objetos vazios:
public void cadastrarNome(String nome) {
String nomeParaCadastrar = nome == null ? "Sem nome" : nome;
// ... Resto do mtodo.
}
Esta abordagem tem a vantagem que, diferente da anterior, os erros referentes ao uso
inadequado denull tendem de fato a desaparecer ao invs de apenas se moverem.
Entretanto, nem sempre esta abordagem possvel ou adequada.
E agora, vamos dar uma olhada melhor no padro de projeto Null Object. A ideia que voc
represente os conceitos de "vazio", "no existe", "no encontrado", etc. com uma instncia
de um objeto, ao invs de usar o null para isso. Eis aqui um exemplo dessa abordagem:
public class Pessoa {
private String nome;
private int idade;
// ... Mtodos.
// Mtodo que retorna um Null Object.
public static Pessoa ninguem() {
Se voc puder trabalhar como interfaces, fica melhor para implementar o padro Null
Object:
public interface Animal {
public String fazerBarulho();
}
public class Cachorro implements Animal {
@Override
public String fazerBarulho() {
return "Au au";
}
}
public class Gato implements Animal {
@Override
public String fazerBarulho() {
return "Miau";
}
}
public class AnimalNenhum implements Animal {
@Override
public String fazerBarulho() {
return "";
}
}
Novamente, vale frisar que voc pode adotar uma destas abordagens para evitar o null se
possvel. Entretanto, nem sempre uma delas possvel e comum aparecerem algumas
situaes aonde realmente deve-se retornar null ou aceitar que algum campo, parmetro ou
varivel local possa ser null em circunstncias normais, e voc tem que saber conviver com
isso. Saber conviver com os nulls quando eles aparecerem sem causar
um NullPointerException faz parte do que o programador Java deve fazer.
No final, todas as formas de se evitar o NullPointerException recaem em organizar a lgica
do seu programa de modo a evitar cair em alguma das situaes aonde ele possa aparecer. E
em quase todas as situaes aonde um NullPointerException aparece, ele dever ser tratado
como um erro de programao (como de fato quase sempre ): entenda porque ele ocorre e
corrija o cdigo para no mais ocorrer.
Por fim, vale a pena recomendar o FindBugs. Trata-se de uma excelente e poderosa
ferramenta de anlise de cdigo Java, capaz de detectar uma grande quantidade de erros de
lgica, bugs, situaes perigosas e ms prticas de programao. E tudo isso obviamente
inclui muitas situaes que podem resultar em NullPointerException.
E se voc for usar o FindBugs (ou alguma outra ferramentas de verificao de cdigo com
caractersticas semelhantes), talvez voc encontre uma
anotao @NotNull, @NonNull ou @Nonnull, juntamente com alguma
anotao @Null, @Nullable ou @CheckForNull. Vrias pessoas de vrios projetos
diferentes criaram vrias verses destas anotaes com propsitos similares (o que ruim,
pois seria bem melhor se houvesse um nico @NotNull cannico e um
nico@Nullable cannico). Voc pode utilizar estas anotaes em campos, variveis,
parmetros e mtodos para dizer para as ferramentas capazes de entend-las que um null em
determinado lugar explicitamente proibido ou permitido. O FindBugs capaz de entender
tais anotaes, embora ele no necessite delas (mas se estiverem presentes, ele poder fazer
uma anlise ainda mais profunda).
Uma outra ferramenta poderosa o Checker Framework, que usa uma abordagem baseada
em anotaes (entre elas o @NonNull e o @Nullable) e funciona como um processador de
anotaes plugvel diretamente no compilador. Com ele, possvel at mesmo transformar
alguns locais onde poderia ocorrer um NullPointerException em erros de compilao,
evitando a dor-de-cabea de ter que rastre-los em testes e/ou debugging.
compartilharmelhorar esta resposta
Victor Stafusa
8.63121744
Muito completa(+1). Julgo que falta apenas referir que mtodos que re
uma lista vazia, isto evitar que o uso do foreach
Iterar um array ou Collection com elementos null
ser lanada. No no caso de System.out.println(z);
de System.out.println(z.lenght()); ramaral
throw new
IllegalArgumentException("O endereo
no pode ser nulo");
}
String morada =
endereco.getMoradaCompleta();
System.out.println(morada);
}
1 @ramaral no leve a mau. Mas, seu cdigo est fora dos padres do java
compila. Voc no poderia editar e arrumar ele ?
1 @wryel Editado. ramaral 13/05 s 22:38
comentar
votar a
favor5v
otar
contra
O que NullPointerException?
NullPointerException uma exceo lanada quando se tenta acessar membros
de um objeto que no existe.
Ou seja, o cdigo presume que uma determinada varivel referencia uma
instncia de um objeto e tenta acessar membros desta instncia; ento, quando
no h instncia de fato (a varivel aponta para null em vez de referenciar um
objeto), uma NullPointerException ser lanada.
Veja:
Pessoa pessoa = new Pessoa();
dizer que ela "aponta para null" mas o mais usual dizermos que "a varivel
null".
Se voc passar para um mtodo qualquer esta varivel que null e este mtodo
tentar acessar um membro do objeto que ele presume existir, ser lanada
uma NullPointerException:
public void processaPessoa(Pessoa pessoa) {
int idade = pessoa.getIdade(); //se pessoa null, aqui ser lanada uma
NullPointerException.
...
}
J esta outra uma validao ruim pois est sujando o cdigo com instrues que
no tem nada a ver com o negcio:
public void processaPessoa(Pessoa pessoa) {
if (pessoa == null) {
throw new InvalidArgumentExcetion("O parmetro 'pessoa' no pode
ser null.");
}
...
}
Este tipo de validao por vezes defendida por facilitar o diagnstico de erros,
mas no muito mais difcil perceber que pessoa null simplesmente deixando
estourar uma NullPointerExceptionmais abaixo. Ento eu opto por manter o
cdigo mais limpo e expressivo e no fao este tipo de validao.
Validaes como esta devem ser feitas nos nveis mais altos da aplicao, na
entrada de dados. Por exemplo:
// usurio entrou com o CPF da pessoa que ele quer processar
Pessoa pessoa = pessoas.find(cpf);
if (pessoa == null) {
throw EntityNotFoundException("No foi localizada nenhuma pessoa
com o CPF " + cpf);
}
processaPessoa(pessoa);
O mtodo acima nunca vai falhar por pessoa ser null, mas o sistema
provavelmente vai falhar e vai ser do pior jeito possvel: silenciosamente.
Todo mundo vai ficar achando que algum foi processado mas isso no ocorreu e
nenhum alerta foi dado.
Ento a NullPointerException foi evitada ao custo do sistema ter sua integridade
corrompida.
Concluso
NullPointerException uma exceo lanada quando se tenta acessar membros
de um objeto que no existe.
A maneira de evit-la no validando no comeo do mtodo se os argumentos
so null (pelo menos no na maioria das vezes).
A maneira de evit-la validando a entrada de dados nos nveis mais altos da
aplicao (entradas do usurio, valores nos arquivos de configurao, fachada de
servios para consumo externo, etc.) e escrevendo cdigo expressivo para que os
seus consumidores saibam como consumi-lo.
Alm disso, algumas vezes vlido no domnio que um objeto no exista (veja
mais acima o exemplo da pessoa que no pde ser processada porque no tinha
sido notificada). Nestes casos, a existncia do objeto deve ser validada antes de
ele ser utilizado para que tenhamos um erro expressivo para o negcio em vez de
termos uma NullPointerException.
Por fim, bibliotecas e frameworks lanam NullPointerException quando so
utilizadas da maneira incorreta.
Quando uma NullPointerException lanada por bibliotecas ou frameworks
(pelo servidor de aplicativos, por exemplo) ficamos muito irados porque
queramos que eles tivessem validado os parmetros e tivessem lanado um erro
mais expressivo. Mas, como eu disse, geralmente mais difcil descobrir por que
uma varivel chegou nula at ali do que simplesmente identificar que um
determinado parmetro null.
compartilharmelhorar esta resposta
respondida
Caff
6.825
comentar
votar a
favor5vo
tar contra
Essa exceo lanada sempre que se tentar acessar um objeto que ainda no foi
inicializado.
O que pode lanar a exceo:
Declarar o objeto;
2 caso: // pense que a classe pessoa j foi criada com o atributo nome e o get/set
Pessoa p;
System.out.Println(p.getNome());
3 caso:
4 caso:
Pessoa p = new Pessoa("maria");
Pessoa pessoas[] = null;
pessoas[0] = p;