class A
{
public void process() { System.out.print(“A,”);}
}
class B extends A
{
public void process() throws IOException{
super.process();
System.out.print(“B,”);
throw new IOException();
}
public static void main(String[] args){
try{ new B().process(); }
catch(IOException e){ System.out.println("Exception");}
}
}
[/code]
Ao compilar esse código, o seguinte erro é gerado:
java:10: process() in B cannot override process() in A; overridden method does not throw java.io.IOException
public void process() throws IOException{
^
1 error
Porém, eu não entendi qual o problema. O erro diz que “o método sobreescrito NÃO joga uma IOException”. Mas ele faz exatamente isso! Quem não joga uma IOException é o método da classe pai (A neste caso)
import java.io.*;
class A
{
public void process() throws IOException { System.out.print("A,");}
}
class B extends A
{
public void process() throws IOException{
super.process();
System.out.print("B,");
throw new IOException();
}
public static void main(String[] args){
try{ new B().process(); }
catch(IOException e){ System.out.println("Exception");}
}
}
se um método na superclasse não lançar exceções verificadas o msm método não pode lançar exceções verificadas na subclasse
creio que sim TiagoTC, uma das regras para declarar exceções tem alguma relação com o polimorfismo
por exemplo se um método da superclasse lançar uma exceção verificada do tipo X, o método da subclasse só poderá lançar uma exceção do tipo X ou Y(desde que Y seja um subtipo de X),
por exemplo
//criando uma classe de exceção X
class MyException extends Exception { }
//criando uma classe de exceção Y extendendo X
class MySubException extends MyException { }
class Animal {
//este método pode lançar uma exceção verificada X
public void falar() throws MyException { }
}
public class Cachorro extends Animal {
//aqui eu só poderia lançar uma execeção verificada Y desde que Y extenda X na superclasse
//reparou que MySubException estende MyException
public void falar() throws MySubException { }
//aqui tb funcionaria porque eu estou lançando a msm exceção que no método da superclasse
//public void falar() throws MyException { }
//aqui tb funciona porq eu estou tentando lançar uma exceção não verificada
//public void falar() throws NullPointerException { }
}
só ressaltando exceções verificadas são aquelas que herdam da classe Exception e exceções não verificadas são aquelas que herdam das classes Error e RuntimeException
editando
corrigi um pequeno erro do código acima.
ela extende RuntimeException que extende Exception e pela regra as classes que extendem a classe RuntimeException são exceções não verificadas ai eu acho que o compilador internamente consegue separar oque é exceções verificadas e não verificadas.
Vejas as classes que extedem RuntimeException: ArithmeticException, NullPointerException, ArrayStoreException, IndexOutOfBoundsExceptions.
Imagina usar trycatch pra acessar um objeto que poderia lançar uma NullPointerException, trycatch pra um cálculo simples, trycatch pra acessar e escrever num Array e por aí vai…