Exceptions com sobrescrição/sobrecarga

Galera, tenho o seguinte código:

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?

não, sim, sim

Porque não… eu consigo sim fazer… qual o problema de declarar outra exception… nao vejo nenhuma…

veja minha alteração:


package teste3;   

class MyException extends Exception {}   
  
class Tire {   
    void doStuff() throws Exception {}   
}   
  
 class Retread extends Tire{   
    public static void main(String args[]) throws Exception {   
        try{
    	new Retread().doStuff();
        } catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
    }   
  
    @Override
    void doStuff() throws Exception, ClassNotFoundException {
    	throw new ClassNotFoundException();
    }  
}  

dtxk aqui consegui compilar normalmente tb, fiquei em dúvida pq li em um blog que não é possível declarar mais exceções que a super classe.

e poder postar o link onde vc viu isso… então eu acho estranho nao poder… aqui foi tranquilo tmb… deve ser alguma convenção…

É 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.

Abs.

Porque não… eu consigo sim fazer… qual o problema de declarar outra exception… nao vejo nenhuma…

veja minha alteração:

[code]

package teste3;

class MyException extends Exception {}

class Tire {
void doStuff() throws Exception {}
}

class Retread extends Tire{
public static void main(String args[]) throws Exception {
try{
new Retread().doStuff();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

@Override
void doStuff() throws Exception, ClassNotFoundException {
	throw new ClassNotFoundException();
}  

}
[/code][/quote]

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.

Porque não… eu consigo sim fazer… qual o problema de declarar outra exception… nao vejo nenhuma…

veja minha alteração:

[code]

package teste3;

class MyException extends Exception {}

class Tire {
void doStuff() throws Exception {}
}

class Retread extends Tire{
public static void main(String args[]) throws Exception {
try{
new Retread().doStuff();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

@Override
void doStuff() throws Exception, ClassNotFoundException {
	throw new ClassNotFoundException();
}  

}
[/code][/quote]

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]

Nossa verdade… que erro meu… :frowning:

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:

  1. as listsa de argumentos devem ser iguais;
  2. o tipo de retorno deve ser o mesmo ou um subtipo.
  3. nível de acesso não deve ser mais restritivo
  4. O método sobrescritoR PODE 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
  5. 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.

Object

|---------------Object |---------------Throwable |---------------Error |---------------Exception |---------------RuntimeException.

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.”