Estou com uma dúvida sobre exceções em java, estou lendo o livro Effective - Java, nele o autor fala sobre exceções e diz que nunca, ou quase nunca, devemos tratar uma exceção não verificada, pois sempre se trata de uma situação de erro que não há possibilidade de tratamento ou recuperação, porém colocando a seguinte situação, um sistema simples uma agenda com parte gráfica desenvolvida em swing digamos que exista um método
public void cadastrarUsuario(Usuario usuario) {
...
}
caso esse método seja invocado com o usuário igual a null irá lançar um exceção não verificada NullPointerException, até aqui ok, essa exceção será capturada pela JVM e no caso de estarmos executando em um console ou dentro do eclipse irá aparecer a exceção lançada no console, porém se tivermos excecutando um .jar, empacotamos a aplicação para destribuí-la e nosso cliente esta executando um .jar, onde essa exceção será mostrada?, o usuário pode ficar clicando infinitas vezes no botão “Adicionar Usuário” que nada irá acontecer e nenhum erro irá aparecer. Essa pode ser uma situação simples, que alguns podem dizer, “Verifica se o objeto está null antes e se estiver mostra um mensagem para o usuário”, mas podem existir situações mais complexas, e ai me pergunto não verifico uma exceção não verificada e posso deixar o usuário do sistema sem resposta, nem ao menos de erro.
Ainda podemos pensar, crie uma classe de exceção própria que estenda de Exception ou Runtime ou até mesmo nesse exemplo NullPointerException, que grave um log ou que mostre a exceção de alguma forma, mais ai vamos quebrar outra boa prática que contém no livro que é, reutilize as classes de exceção que já existam e teríamos que ter várias classes de exceção que servem para a mesma coisa que suas superclasses, apenas exibem ou geram log das mensagens de erro.
Uma das coisas mais importantes que voce tem que fazer quando escreve a UI é validar os dados que o usuario insere no sistema. Se o usuario preencher um campo de forma incorreta ou nao preencher um campo obrigatorio, o sistema nao deve nem comecar a executar a regra de negocio (e assim deixar estourar um NullPointerException). Isso é muito importante em qualquer sistema.