Programação Defensiva e o NullPointerException

Oi,

É importante notar que a própria página que você inkou condena o uso de assertions no contexto deste tópico:

O fato de ser possível desligar assertions em runtime torna a parte de checagem um pouco vaga, IMHO. Testes unitários podem ajudar mas o custo em ter uma chacagem que usa exceções em vez de asserções é muito baixo para ser considerado na maioria dos casos.

[quote=leandrocm86]Será que é viajar demais se eu pensar que seria melhor que Java não permitisse passar valores nulos como parâmetros e, além disso, não permitisse que um método que deve retornar algum tipo qualquer retorne null?
Enfim, será que seria bom que referências a objetos fossem tratadas assim como os tipos primitivos nessas situações?
Verificar se uma referência qualquer pode não ter sido inicializada sempre pode ser feito em tempo de compilação.
[/quote]

Sobre NullPointerException em específico (o artigo linkado cobre mais que isso) não só isso faz sentido como é o tipo de coisa que e espera de uma linguagem tipada estaticamente. Infelizmente a tipagem estática em java é bem meia-boca e cabe ao progrmador fazer este tipo de verificação.

[quote=leandrocm86][quote=sergiotaborda]
Não faça isto. Nunca faça de catch de NullPointerException. (aliás essa exceção deveria ser um Error, mas… )[/quote]
Mas nesse caso eu tenho que resolver sim, ué. Se eu pegá-la lá no servlet (que é a minha intenção), cabe ao servlet ir pra página adequada e exibir a mensagem de erro (de forma limpa).
[/quote]

Até aqui tudo bem.

Claro que tem. Vc cria um conjunto de classes para fazer a validação.

[quote]
Então eu tenho 2 opções: Ou encho cada código com um monte de verificação ou simplesmente trato lá em cima no servlet. O efeito final deve ser o mesmo: Ir para alguma página com uma mensagem de erro adequada.[/quote]

Mas tratar “lá em cima no servlet” vc não trata NullPointer. Vc trata Throwable. Ou seja, vc captura toda e qualquer exceção. Loga-a e envia o usuário para uma tela agaradável com uma umensagem educada. Nâo deixa explodir na cada do servlet container nunca.

Tratamento de exceções é como tratamento de bomba atomica : não pode explodir nunca!

[quote=Marcio Duran][quote=sergiotaborda]
Não faça isto. Nunca faça de catch de NullPointerException. (aliás essa exceção deveria ser um Error, mas… )
[/quote]
-Como eu posso obter um monitoramento de Exceções ? ; A ponto que eu possa detectar, que tal execption está refletindo um tratamento inválido em algum ponto do meu sistema ???[/quote]

Se eu entendi a pergunta, vc quer saber como monituorar se o programador está tratando exceções corretamente.
Se não foi isso que vc quiz perguntar, é a isso que vou responder … :lol: :lol:

Vc pode usar ferramentas como o CheckStyle ou o PMD se vc tiver paciencia e conhecimento para criar uma regra de validação. O que é dificil, não pela ferramenta mas pelo caracter não -localizado das exeções. O melhor mesmo e colocar um desenvolvedor com experiencia em tratamento de exceções a verificar o codigo.

Tratamento de exceções é um conjunto de boas práticas relacionadas ao onde ao como.
Por exemplo, fazer catch de exeções e logar consumindo a exeção é errado normalmente. Exceto quando estamos na ultima camada do sistema ( um servlet por exemplo) . Uma ferramenta indicará sempre o erro porque ela não tem noção do que é “a ultima camada”.

[quote=Rubem Azenha][quote=Marcio Duran]
-Como eu posso obter um monitoramento de Exceções ? ; A ponto que eu possa detectar, que tal execption está refletindo um tratamento inválido em algum ponto do meu sistema ???[/quote]

Marcio, se sua aplicação estiver rodando dentro dum AS ou Servlet Container, deixe a excessão estourarno container, ele vai tratar de efetuar o logging e redirecionar para uma página de erro customizada (se você fizer a configuração de forma correta).[/quote]

Neste contexto isso pode vir de Exceções lançadas Programaticamente (Criado por um desenvolvedor de uma determinada API ou vindas provinientes da JVM ou JVMs proprietárias), acho que isso é bem mais complexo.

[quote=Marcio Duran][quote=Rubem Azenha][quote=Marcio Duran]
-Como eu posso obter um monitoramento de Exceções ? ; A ponto que eu possa detectar, que tal execption está refletindo um tratamento inválido em algum ponto do meu sistema ???[/quote]

Marcio, se sua aplicação estiver rodando dentro dum AS ou Servlet Container, deixe a excessão estourarno container, ele vai tratar de efetuar o logging e redirecionar para uma página de erro customizada (se você fizer a configuração de forma correta).[/quote]

Neste contexto isso pode vir de Exceções lançadas Programaticamente (Criado por um desenvolvedor de uma determinada API ou vindas provinientes da JVM ou JVMs proprietárias), acho que isso é bem mais complexo.[/quote]

Márcio, se você tem uma exception de negócio, lançada programticaticamente, é muito fácil tratar isso e mostrar uma resposta para o usuário. No caso de exceções que você (sua aplicação) não saiba como tratar, você cria uma tela ou página padrão para ser exibida.

Não é necessário tratar cada um dos possíveis erros que venham a ocorrer.

Sim, e algo neste contexto mesmo !!!

O yourkit java http://www.yourkit.com/ , não seria mais completo, já que o CheckStyle você verifica codigos duplicados !!!

ArrayIndexOutOfBounds, ClassCastException, NullPointerException são startadas pela JVM, entretando isso esta correlacionado tanto com algoritmos de software mau projetados, ou outra situação quando ferramentas não alinhadas para identificar essas threads de forma precisa ao monitoramento em um algum ponto do ambiente do desenvolvimento que pode estar vindo do sistema ou fora dele, não seria corrento simular o sistema a ponto de ter esse efeitos previsíveis !!!

[quote=Marcio Duran]

ArrayIndexOutOfBounds, ClassCastException, NullPointerException são startadas pela JVM, entretando isso esta correlacionado tanto com algoritmos de software mau projetados, ou outra situação quando ferramentas não alinhadas para identificar essas threads de forma precisa ao monitoramento em um algum ponto do ambiente do desenvolvimento que pode estar vindo do sistema ou fora dele, não seria corrento simular o sistema a ponto de ter esse efeitos previsíveis !!![/quote]

Essas exeções são tipicamente erros de programação. Não de desenvolvimento ou projeto.
A forma de simular e estressar o sistema para validar que elas não acontecem é fazer testes unitários. Não outra forma mais segura.

Bom, por curiosidade o que me fez pensar em simular tais eventos foi um tecnologia chamada simjava.

SimJava:
A simjava simulation is a collection of entities each running in its own thread. These entities are connected together by ports and can communicate with each other by sending and receiving event objects. A central system class controls all the threads, advances the simulation time, and delivers the events. The progress of the simulation is recorded through trace messages produced by the entities and saved in a file.

É claro que tem uma outra finalidade, é orientada pra telecomunicação, mas eu imaginei o uso disso para adaptar em FrameWorks de soluções a atender situação de missão critica.

http://www.dcs.ed.ac.uk/home/hase/simjava/index.html

http://www.icsa.inf.ed.ac.uk/research/groups/hase/simjava/guide/tutorial.html#1.1

Claro que temos, ferramentas como Junit, XUnit, Jmeter, entre outras pra test e especializadas, mas não um instrumento orientado a simular estado e comportado de todo um cenário em n-tier.

Posso estar viajando mas a palavra chave é simular ocorrencia de exception em qualquer situação de estado, que pode vir de um estado programático ou pela JVM, dentro do meu sistema ou fora dele(compartilhado). O principio de SOA e algo assim, me permite atender serviços em sistema até não conhecido sem intervenção ou queda de produtividade..

Eu entendo a sua preocupação, mas ela é , se certa forma, infundada.
Exception que esperamos e sabemos resolveu vão estar explicitamente tratadas no codigo. Todas as outras são exeções que não esperamos e/ou não sabemos resolver. Logo, quando uma exceção inesperada (que tinhamos tratado) acontece, o objetivo é alterar o código e tratá-la. Eu entendo que vc queira algum framework que estresse o sistema tentando lançar todas as exçãoes possiveis, mas isso é na prática uma tarefa de altas porque o próprio conceito de exceção significa que não ha uma regra deterministica para saber como, quando e porque, uma execção será lançada.

Pode ser importante em software de misssão critica sim ( como aqueles dos quais dependem vidas) e é interessante.
Contudo, não é com um profiler (yourkit) que vc vai fazer isso ou um sistema de rede (simjava). É com um framework especifico que instrumente o código e comece a lançar exceções de todos os tipos. Contudo, isso pode levar a um sistema completamente inchado de tratamento de exceções que vc não sabe tratar. Logo, é tão util como um catch trowable no objeto da camada mais exterior.

Acho que você não leu tudo. Não sei se você não acompanhou o tópico e viu que o autor perguntou dos métodos privados e do estresse de fazer verificações o tempo todo, ou se a palavra “assertions” ligou um alerta na sua cabeça (já que verificar com assertions em métodos públicos é realmente erradíssimo).

Mas estavamos falando de métodos privados, e o artigo é bem explicito que, nesse contexto, é possível sim usar asseções:

Aliás, você também pode reler a primeira frase da citação que você mesmo colou.

Mas eu ainda sou mais restritivo nesse assunto. Eu considero todos os acessos que não são private como públicos. Isso porque o Java é muito permissivo quando o assunto são pacotes. Por isso, asserções para validação de pré-condições, só em métodos privados mesmo.

Você faz testes unitários em métodos privados?
Já ouvi falar de programadores que fazem. E de fato, chegam a usar reflexão para invoca-los.

[size=18][color=blue]Exception management and error tracking in J2EE[/color][/size]
[color=red]Develop an exception framework for handling errors in the J2EE world[/color]

:arrow: “Logo, é tão util como um catch trowable no objeto da camada mais exterior.”

O que atende o contexto logo abaixo ???

http://www.javaworld.com/javaworld/jw-07-2005/jw-0711-exception.html?page=1

[quote=ViniGodoy]
Acho que você não leu tudo.[/quote]

Você tem razão. Eu acompanhei o tópico, o que eu não percebi foi que você falava explicitamente de métodos privados.

[quote=pcalcado][quote=ViniGodoy]
Acho que você não leu tudo.[/quote]

Você tem razão. Eu acompanhei o tópico, o que eu não percebi foi que você falava explicitamente de métodos privados.[/quote]

Eu imaginei. Num tópico sobre programação defensiva, também ligaria alertas na minha cabeça ao ler sobre assertions. =D

[quote=Marcio Duran][quote=sergiotaborda]
É com um framework especifico que instrumente o código e comece a lançar exceções de todos os tipos. Contudo, isso pode levar a um sistema completamente inchado de tratamento de exceções que vc não sabe tratar. Logo, é tão util como um catch trowable no objeto da camada mais exterior.
[/quote]
[size=18][color=blue]Exception management and error tracking in J2EE[/color][/size]
[color=red]Develop an exception framework for handling errors in the J2EE world[/color]

:arrow: “Logo, é tão util como um catch trowable no objeto da camada mais exterior.”

O que atende o contexto logo abaixo ???

http://www.javaworld.com/javaworld/jw-07-2005/jw-0711-exception.html?page=1[/quote]

Entenda que isso não é um framework para testar exceções nem para controlar exceções. É um framework para facilitar ao programador ter que lidar com exceções, de quebra incluindo boas práticas. O mesmo vc pode concluir lendo:

http://sergiotaborda.wordpress.com/java/trabalhando-com-excecoes-conceitos/
http://sergiotaborda.wordpress.com/java/excecoes-boas-praticas-mas-praticas/

e particularmente
http://sergiotaborda.wordpress.com/java/excecoes-classes-utilitarias/
Só não me alongei tanto como o texto do javaworld.

O ponto é que: é o programador que controla as exceções, já que essa é uma tarefa que inclui seguir regras e fazer trade-offs que uma máquina teria dificuldade já que é preciso entender o significado do codigo, não só o codigo em si.

  • Bommmmm!!! tem razão deveria estar mesmo viajando, com tantos FrameWorks que estão surgindo por ai, achei que poderia achar um outro que tivesse essa idéia surreal !!! :lol: :lol: :lol:

Vou dar uma lida no seus artigos !!! :thumbup: