Lançar MENOS exceções que o método sobreposto (ou seja, a alternativa “no throws clause” está correta);
Lançar exceções MAIS ESPECíFICAS que o método sobreposto (ou seja, “any subclass of IOException” está correta);
Lançar A MESMA exceção que o método sobreposto (ou seja, a alternativa “IOException” está correta);
Lançar uma “unchecked exception” (ou seja, a alternativa “NullPointerException” está correta);
O que você não pode fazer é lançar exceções MENOS ESPECÍFICAS que o método sobreposto (ou seja, “Exception”, que é a superclasse de IOException.
Examine o seguinte código.
class Animal {
public void comer() throws IOException {}
}
class Cachorro extends Animal {
public void comer() throws FileNotFoundException {
throw new FileNotFoundException ("Au!");
}
}
class Gato extends Animal {
// isto dá um erro de compilação...
public void comer() throws Exception {
throw new SQLException ("Miau!");
}
}
class Teste {
public static void main(String[] args) {
Animal toto = new Cachorro();
Animal mimi = new Gato();
try {
toto.comer();
} catch (IOException ex) {
}
try {
mimi.comer();
} catch (IOException ex) {
} // o mimi gera um SQLException que não dá para pegar
// se aceitássemos o código acima.
}
}