Questao sobre Exception

Pessoal, to estudando aqui e me deparei com a seguinte questao:

Which of the following exceptions can be declared in the throws clause of a method overriding the method:

public void perform_work( ) throws IOException {…}

alternativas (escolha 4):

IOException
Exception
NullPointerException
No throws clause
Any Subclass of IOException

Todas essas estao corretas, menos Exception.

Agora a pergunta:
IOException não é uma exceção checada?
Ela não deveria ser tratada OU declarada?

Porque entao a alternativa “No throws clause” está correta???

:shock: :shock: :shock: :shock:

Quando você sobrepõe um método, ele pode:

  • 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.
    }
}

VALEUUUU!!!