Subscrição com exceções

Tenho uma questão que me deixou em dúvida.
Ex.:

public class AssertTest{
public void methodA(int i) throws AssertionError{
assert i<1024:“Invalid value”;
}
}

Quais métodos podem ser válidos para uma subclasse de AssertTest?
A - public void methodA(int i)
B - public void methodA(int i) throw Exceptio
C - public void methodA(int i) throw Throwable
D - public void methodA(int i) throw Error
E - Only option A is valid

Resposta A e D

Por que a letra D está correta se AssertionError é subclasse de Error?

É exatamente esse o motivo! Você pode modificar a exceção lançada pelo método por uma mais genérica, em outra palavras: Que esteja acima na árvore de herença. Mas nunca por uma mais específica.

Espero que tenha dado pra enteder!
[s]

a propósito, está pergunta é sobre uma substituição VÁLIDA se atente as regras disso.

O que eu não entendi é o seguinte.
Se eu tiver o código

public class AssertTest{
public void methodA(int i) throws IllegalArgumentException{
assert i<1024:“Invalid value”;
}
}

eu não posso subscresver como

public void methodA(int i) throws Exception{ }

pois Exception está mais acima na herança, certo?

Gostaria de saber porque coma AssertionError e Error é permitido,
visto que Error está mais acima na herança que AssertionError?

marcos vc ta “metendo os pes, pelas maos” rs… mais falando serio… a AssertionError é um tipo de exceção é que da class Error… ela nao está acima nao… lembrese da hierarquia das exceções que vc mata qualquer questao… veja:

Throwable–> Exception --> RuntimeException.
Throwable–> Exception… //aqui as verificadas
Throwable --> Error- -> //aqui as nao verificadas que causaram erro.

As exceções de Error é quando aconteceu algo que nunca deveria ter acontecido na vida… um estouro de memoria por exemplo… nesse caso ai de assertion ser configurado para falso… jamais deve acontecer isso… entao AssertionError é uma exceção nao verificada da class Error que é uma exceção que algo jamais deveria ter ocorrido ou seja, assertion false.

flw!!

[quote=tgpadua]É exatamente esse o motivo! Você pode modificar a exceção lançada pelo método por uma mais genérica, em outra palavras: Que esteja acima na árvore de herença. Mas nunca por uma mais específica.

Espero que tenha dado pra enteder!
[s][/quote]

Isso que vc falou ta tudo errado… é totalmente o contrário… vc NÃO pode sobrescrever um método colocando nenhuma exceções mais genérica nem mesmo novas exceções verificadas.

O que aconteceu nessa questão foi que na opção D o método declarou que lança Error, que é mais genérica que AssetionError mas que NÃO É VERIFICADA. Apenas por esse motivo a declaração é válida.

public void methodA(int i) throws IllegalArgumentException{
   assert i<1024:"Invalid value";
}

public void methodA(int i) throws Exception{ } 

Isso aqui não vale justamente porque Exception é VERIFICADA, assim sendo, não podemos sobrescrever declarando que o método lança uma exceção mais genérica.

Valeu!!!