Dúvida sobre regra para declarar método da interface

1 resposta
A

Olá pessoal, tem uma regra que não entendi:
“Declare no checked exceptions on implementation methods other than those declared by the interface method, or subclasses of those declared by the interface method”

Alguem pode me explicar? Obrigado!

1 Resposta

Rodrigo_Sasaki
Imagine que você tem a seguinte interface:
public interface Openable

    public void open();

}
O seu método open, não lança nenhuma exceção verificada, certo? Agora vamos ver a classe que implementa o método:
public class Door implements Openable{

    private boolean opened;

    @Override
    public void open(){
        opened = true;
    }

}
Nada fora do comum, certo? Agora a classe que executa isso:
public class DoorTest{

    public static void main(String[] args){
        Door door = new Door();
        door.open();
    }

}
Até aqui ainda tudo normal, o compilador sabe que o método open não lança nenhuma exceção, portanto o método compila e é executado normalmente quando invocado. Agora vamos supor que o método que implementa a interface, pode lançar exceções que não estão declaradas na interface, o que aconteceria com chamadas polimórficas? Veja o método open da classe Door reescrito:
public void open() throws DoorAlreadyOpenedException{
    if(opened){
        throw new DoorAlreadyOpenedException("This door is already opened!");
    }else{
        opened = true;
    }
}
Se alguém fizer uma chamada polimórfica a esse método através da interface Openable, ele nunca saberia que essa exceção poderia ser lançada, pois a interface não diz isso. então ao fazer um método como esse:
public void open(Openable openable){
    openable.open();
}
Executamos o método open sem tratar nenhuma exceção, pois a interface diz que o método não lança nada, agora se o Openable enviado como parâmetro for um Door, poderia lançar uma DoorAlreadyOpenedException que ninguém esperava, não é? E isso não é bom.

Por isso que um método que implementa um método pré-definido em uma interface, não pode lançar nenhuma exceção não-verificada que não tenha sido declarada na própria interface.

Fez sentido?

Criado 11 de setembro de 2012
Ultima resposta 11 de set. de 2012
Respostas 1
Participantes 2