3
respostas

IllegalArgumentException e IllegalStateException

Qual a diferença do IllegalArgumentException e do IllegalStateException?

3 respostas

Olá Tatiana, tudo bem com você?

Um IllegalArgumentException ocorre quando um método recebe um argumento inválido. Geralmente é usada em casos onde recebemos um input inválido* que não deve ser aceito em nossa aplicação, como é o caso de um email no formato inválido, um campo obrigatório que foi deixado vazio, um input no formato inválido, etc...

*não está de acordo com as regras de negócio

No caso do IllegalStateException, essa exceção geralmente é usada em casos onde invocamos um método em um momento indevido, ou seja, seja lá o que o método deveria fazer, ele não deveria ser executado nesse momento em específico.

No caso da conexão a um banco de dados que o Nico estava simulando em aula, essa exceção poderia ocorrer caso tentássemos ler os dados que estão no banco sem antes ter estabelecido uma conexão entre nossa aplicação e o banco. Nesse caso, receberíamos algo como java.lang.IllegalStateException: database not open avisando que o método con.leDados() está sendo usado em momento inapropriado já que não temos conexão com o banco de dados.

Fez sentido? Se ficou alguma dúvida, por favor, me avise! ;)

Grande abraço e bons estudos!!

Obrigada por responder, Thiago. No caso então, para ver se entendi, o IllegalArgumentException é para coisas relacionadas a expressões, entradas e interações diretas? Como o usuário adicionando campos ou algo do tipo? Enquanto o IllegalStateException seria mais um erro (excessão) relacionado a funcionalidade do sistema, onde algo (método ou objeto no geral) não deveria ser chamado ou implementado?

Opa Tatiana, tudo bem?

Eu dei esses exemplos, mas, geralmente, por uma questão de boa prática, o ideal é que em casos onde o input inválido vem de uma fonte externa (como um usuário ou um sistema externo mesmo) nós usamos uma checked exception para que possamos tratá-la (a exceção) e apresentar uma mensagem de erro ao usuário para que, por fim, ele possa se recuperar desse erro fornecendo um input correto da próxima vez.

Agora, se o erro parte de alguma parte interna da nossa aplicação - como o banco de dados, esse input que nosso método está recebendo deveria ser totalmente confiável já que, teoricamente, ele deveria ter sido validado antes mesmo de ter entrado no nosso sistema. Nesse caso, faz total sentido jogarmos uma IllegalArgumentException já que ela é uma unchecked exception e, como uma regra geral, nós nunca tratamos esse tipo de exceção! Já que, pra começo de conversa, esse tipo de exceção acontece por culpa nossa (como programadores) que deixamos esse valor inválido entrar no escopo da nossa aplicação.

Em outras palavras, quando encontramos exceções unchecked como a IllegalArgumentException e a IllegalStateException, não devemos tratá-las para que possamos nos recuperar do erro, mas sim corrigir a causa do problema que permitiu que um input inválido fosse aceito.

Acredito que você não precise levar todas essas regras tão a sério... pelo menos não em um sistema fora de produção! rs

Mas se você encontrar um IllegalArgumentException por aí, é só pensar que alguém (ou algum sistema) passou alguma informação inválida e que esse erro muito provavelmente foi causado por uma falha de programação. O mesmo vale para o IllegalStateException, afinal, no exemplo que eu dei do banco de dados, foi culpa de quem desenvolveu o sistema que a aplicação tentou ler dados do banco sem ter criado uma conexão antes.

De resto, você parece ter compreendido bem a função de cada uma dessas exceções! :D

Não sei se consegui ser compreensível nessa explicação, mas se algum ponto ainda não fez sentido é só avisar!