Herança e Exceção

[b]Bom dia senhores, eu denovo (antes era Madara) agora corrigi o nome.

Ainda nos meus estudos, ví a situação abaixo, o que não faz sentido para mim. Pelo que eu soube, não se deve lançar exceções verificadas novas ou mais abrangentes.
[/b]

[code]public class Avo{
/Não há exceções nos metodos da classe Avo/
public void getClasse1(){}
public void getClasse2(){}
public void getClasse3(){}
public void getClasse4(){}
public void getClasse5(){}

}

class Neto extends Avo{
/Nesta classe eu estou sobreescrevendo os métodos lançando uma exceção./
public void getClasse1() throws ArithmeticException {} //Compila
public void getClasse2() throws NumberFormatException {} //Compila
public void getClasse3() throws NullPointerException {} //Compila
public void getClasse4() throws Exception {} //Não Compila
public void getClasse5() throws IOException {} //Não Compila
}
[/code]
Minha dúvida é o seguinte, na classe Avó é lançada alguma exceção de forma oculta?

Obrigado.

Não.

Na classe Avo você não lança nenhuma exceção em nenhum dos métodos, portanto quando for sobrescrevê-los, você não pode lançar nenhuma exceção verificada.

Então porque a sobrescrita dos métodos getClasse1, 2 e 3 compila? Justamente porque as exceções lançadas ali não são verificadas :slight_smile:

Dica: Exceções não-verificadas são as que herdam de RuntimeException

Exception e IOException não compilam o seu código porque elas são Checked exceptions, ou seja, você é obrigado a tratá-las. Como na superclasse os métodos não possuem esse lançamento, a regra de override não funciona. Para funcionar, ou você remove o lançamento dos métodos sobrescritos ou você implementa eles na superclasse.

Em herança, as responsabilidades também são herdadas, incluindo exception.

Eita, então lí errado, achei que ArithmeticException e NumberFormatException fossem checadas. Comi mosca. Obrigado pessoal.