Qual a exceção mais apropriado pro meu caso, StateException ou ArgumentException?

5 respostas
analyser

Olá, tenho um ambiente onde forneço serviços a cliente que são aplicações externas, e nesses serviços recebo um objeto como parametro que representa uma entidade, e no meu serviço valido se a entidade (argumento), passado como parâmetro é válido, entre essas validações verifico se o estado do objeto é válido tb, pois isso faz parte do contrato.

Agora a dúvida, qual exceção devo lançar para o meu cliente, IllegalArgumentException ou IllegalStateException, já que o argumento que ele me passou é inválido e seu estado tb pode ser.

Até mais.

5 Respostas

tnaires

Use IllegalArgumentException para esse caso. IllegalStateException é utilizada quando um método é chamado em um momento inapropriado.

analyser

Obrigado pelo resposta tnaires, eu vi a um tempo o post do “Shoes”, sobre contratos nulos (http://www.fragmental.com.br/wiki/index.php/Contratos_Nulos), e nele ele utiliza o IllegalStateException, para denotar que o estado do objeto é inválido, não seria esse o caso tb, o estado do objeto que recebi é inválido?

Valew

tnaires

O Shoes usa IllegalStateException para validar o estado do próprio objeto, e não de outro que ele esteja recebendo como argumento de método. Ou seja, sempre que os dados do objeto sofrem alguma modificação, é preciso checar seu estado. Caso ele tenha chegado em um estado inválido, uma IllegalStateException é lançada. Sacou a diferença?

Como exemplo, temos a classe abaixo:
class NumeroNatural {
    private int valor;

    public void setValor(int valor) {
        // Naturais não podem ser menores que zero.
        if (valor < 0) {
            throw new IllegalArgumentException("Valor inválido");
        }

        this.valor = valor;
    }

    public void subtrair(NumeroNatural b) {
        this.valor -= b.getValor();

        // O argumento foi válido, mas dependendo do valor o objeto pode chegar a um estado inválido.
        if (valor < 0) {
            throw new IllegalStateException("Um número natural não pode ser menor que zero.");
        }
    }
}
Não é responsabilidade do método subtrair() validar o estado do objeto passado como parâmetro.
analyser

Valew tnaires, eu já tinha imaginado essa diferença, mais é que o sentido da exception deixa duvida, e é sempre bom ouvir a opnião dos outros.

valew e abraço

A
<blockquote>	//método

public void subtrair(TestarIllegalState b) {

this.valor -= b.getValor();

//o argumento foi válido, mas dependendo do valor o objeto pode chegar

//a um estado inválido.

if (valor < 0) {

throw new IllegalStateException(Um número natural não pode ser menor que zero.);

}

}</blockquote>

não entendí essa parte… tou tentando gerar essa exceções…

Criado 29 de setembro de 2009
Ultima resposta 22 de set. de 2010
Respostas 5
Participantes 3