package teste;
class MyException extends Exception {}
class Tire {
void doStuff() throws Exception {}
}
class Retread extends Tire{
public static void main(String args[]) throws Exception {
new Retread().doStuff();
}
@Override
void doStuff() throws Exception, ClassNotFoundException{
}
}
Minhas dúvidas são:
1 - No meu método sobrescrito doStuff() eu posso declarar mais exceções do que o método da classe Tire?
2 - No meu método sobrescrito doStuff(), não posso ter uma exceção mais “ampla na hierarquia” que a declarada no método da classe Tire, correto?
3 - Se eu sobrecarregar o método doStuff(int a) assim, este não vai possuir nenhuma relação com as exceções do método da classe Tire, correto?
É possível sobrescrever um método que lança uma exception que seja filha da classe Exception, por exemplo:
PrintException
NotBoundException
Entre outras
Nessa cadeia de sobrescrições o método sobrescrito pode lançar a mesma classe ou uma menos abrangente. Por exemplo:
Se um método sobrescrito lança uma PrintException, se por acaso ele precisar ser sobrescrito novamente só poderá ser utilizada uma classe filha de PrintException
Além disso é possível lançar qualquer filha da classe RunTimeException ou da classe Error livremente.
Esse caso deu certo porque na superclasse doStuff() declara lançar Exception, e na subclasse você declara lançar Exception e ClassNotFoundException, que é filha de Exception, por isso não ocorre o erro. Na subclasse, você pode declarar mais de uma exceção normalmente, desde que todas elas sejam filhas das exceções declaradas na superclasse. Tente usar um tipo de exceção mais específico na superclasse e você vai entender.
Esse caso deu certo porque na superclasse doStuff() declara lançar Exception, e na subclasse você declara lançar Exception e ClassNotFoundException, que é filha de Exception, por isso não ocorre o erro. Na subclasse, você pode declarar mais de uma exceção normalmente, desde que todas elas sejam filhas das exceções declaradas na superclasse. Tente usar um tipo de exceção mais específico na superclasse e você vai entender. [/quote]
Meu questionamento foi “1 - No meu método sobrescrito doStuff() eu posso declarar mais exceções do que o método da classe Tire?”. Não falei nada sobre questões de hierarquia/abrangência, das quais eu tenho conhecimento.
Pelo que entendi pelo livro ca Kathy (p.62, OO):
Para sobrescrever um método:
as listsa de argumentos devem ser iguais;
o tipo de retorno deve ser o mesmo ou um subtipo.
nível de acesso não deve ser mais restritivo
…
…
O método sobrescritoRPODE lançar qualquer exceção (de tempo de execução) não-verificada, independentemente de o método sobrescrito declarar OU não a exceção
O método novo NÃO DEVE lançar exceções verificadas novas ou mais abrangentes que as declaradas pelo método sobrescrito.
Se doStuff (da classe pai) lançar FileNotFoundException, NÃO poderá ser sobrescrito por um método que declare uma SQLException, Exception ou qualquer outra que não seja de tempo de execução.
Fiz um teste rápido no NetBens: o metodo sobrescrito lançando “IOException” e método sobrescritor lançando “IOException, SQLException” e deu erro, nem compilou.
Cuidado ao usar lançar Exception, acima dela, se não me engano, temos apenas Throwable e Object.
Portanto ao lançar “Exception e ClassNotFoundException”, pela regra 7): ClassNotFoundException é MENOS abrangente que Exception. Por isso quem testou funcionou.
Então acredito que a resposta para a pergunta número 1 é: NÃO.
Minha dúvida era na quantidade de exceções que eu poderia lançar em um método sobrescritor, desde que respeite a abrangência das exceções, é claro.
Mas isso foi esclarecido aqui: “Esse caso deu certo porque na superclasse doStuff() declara lançar Exception, e na subclasse você declara lançar Exception e ClassNotFoundException, que é filha de Exception, por isso não ocorre o erro. Na subclasse, você pode declarar mais de uma exceção normalmente, desde que todas elas sejam filhas das exceções declaradas na superclasse. Tente usar um tipo de exceção mais específico na superclasse e você vai entender.”