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.
classAnimal{publicvoidcomer()throwsIOException{}}classCachorroextendsAnimal{publicvoidcomer()throwsFileNotFoundException{thrownewFileNotFoundException("Au!");}}classGatoextendsAnimal{// isto dá um erro de compilação...publicvoidcomer()throwsException{thrownewSQLException("Miau!");}}classTeste{publicstaticvoidmain(String[]args){Animaltoto=newCachorro();Animalmimi=newGato();try{toto.comer();}catch(IOExceptionex){}try{mimi.comer();}catch(IOExceptionex){}// o mimi gera um SQLException que não dá para pegar // se aceitássemos o código acima.}}