Overriding e Throws Exception

3 respostas
A
Ola.. olha a duvida se eu por esse código funciona
import java.io.*;

class Base {
	public void a() throws IOException {
		System.out.println("A");
	}
}

public class Teste extends Base {
	public Teste() {
		a();
	}

	public void a() {
		System.out.println("B");
	}

	public static void main(String args[]) {
		new Teste();
	}
}

se na sub classe e por assim, public void a() throws IOException {
}

da o seguinte erro
unreported exception java.io.IOException; must be caught or declared to be thrown a();

se eu por outra Exception, exemplo Exception apenas da outro erro
Teste cannot override a() in Base; overridden method does not throw java.lang.Exception
public void a() throws Exception {

se eu tirar o IOException da superclasse e por trhows na subclasse da erro tb..

eu concluo entao que apenas a superclasse poderá ter throws em métodos overriding e os métodos da subclasse nao tem thorws, porque senao da problema...

agora eu preciso por uma FileNotFoundException na subclasse.. nao da pra fazer com throws? vou ter que usar try/catch mesmo??

o código de exemplo
import java.io.*;

class Base {
	public void a() throws FileNotFoundException {
		System.out.println("A");
	}
}

public class Teste extends Base {
	public Teste() {
		a();
	}

	public void a() {
		System.out.println("B");
		FileInputStream file = new FileInputStream("teste.txt");
	}

	public static void main(String args[]) {
		new Teste();
	}
}

Obrigado

3 Respostas

Jair_Rillo_Junior

Ola Alex… deixa eu dar uma explicada pra voce em um conceito básico sobre Exception…

sempre que vc chamar um método que tem throws AlgumaExcessão, vc tem que chamar esse método dentro de um block Try/Catch…
se vc tem um método public void a() throws IOException {

vc precisa chamar ele

try {

a();

} catch (IOException e) {}

entendido né??

entendo isso fica facil entender o que aconteceu com o seu programa
o primeiro código que nao tem throws no método da classe filha, não precisa do throws pois quando vc colocou a chamada do método a() dentro do construtor, ele ja sabia que iria usar o método da classe filha, se vc colocasse super.a() iria dar erro… por isso que quando vc colocou throw na classe filha deu erro, pois seu a() nao esta sendo chamado dentro de um try/catch

vc pode fazer um overriding de métodos e em cada um colocar um trhows diferente, só fique ligado pra identificar em qual método ele vai e se vc colocou a chamada do método dentro de um try/catch correspondente ao throws dessa Exception

Bani

A explicação do ManchesteR está correta, exceto pelo último parágrafo.
Você não pode fazer throws de qualquer coisa na classe filha!
Exemplo: se no método da classe pai você tem throws IOException, no método da classe filha:

Você pode ter:

  • throws IOException
  • throws uma subclasse de IOException
  • throws de Error / RuntimeException (que são unchecked)
  • não throws nada [size=“7”](de repente passei a entender porque tem gente radicalmente contra misturar portugues com ingles)[/size]

Você não pode ter:

  • throws de uma Exception que seja de uma classe mais genérica do que IOException

Isso por causa do polimorfismo. Dependendo da forma que você usa esse conceito, você pode ter um método que vai estar utilizando alguma superclasse qualquer sem nem saber qual é realmente a classe do objeto (por exemplo, recebendo esse objeto como parâmetro do método). Então quando o compilador vai testar se você tratou todas as suas exceptions, não esqueceu nenhum try/catch ou throws, ele vai simplesmente olhar pelo tipo da variável em que está sendo chamado o método (no caso, a superclasse) se ele está fazendo throws de alguma coisa, afinal, ele só vai realmente decidir o método certo a ser usado (da subclasse) em tempo de execução. Dessa forma, se na subclasse você tenta colocar um throws mais abrangente do que o da superclasse, o compilador não teria como advinhar que no caso você queria usar a subclasse e por isso precisaria de “mais” try/catch do que se fosse na superclasse para tornar a chamada ao método seguro, e portanto ele “corta o mal pela raiz” nem deixando você fazer esse tipo de declaração.

Jair_Rillo_Junior

Obrigado Bani por me corrigir

realmente eu não sabia que não podia por qualquer Exception na classe filha…

como eu só precisei usar isso uma vez na vida e deu certo, pois na classe pai era IOException e na filha era FileNotFoundException…

valeu pela explicação

Criado 2 de maio de 2003
Ultima resposta 3 de mai. de 2003
Respostas 3
Participantes 3