Dúvida com Assertionerror [resolvido]

Olá pessoal XD … eu vi no TestKiller uma pergunta assim:


static void test() throws Error { 
 if (true) throw new AssertionError(); 
 System.out.print(?test ?); 
 } 
 public static void main(String[] args) { 
 try { test(); } 
 catch (Exception ex) { System.out.print(?exception ?); } 
 System.out.print(?end ?); 
 } 

Qual é o resultado?

A. end
B. Compilation fails.
C. exception end
D. exception test end
E. A Throwable is thrown by main.
F. An Exception is thrown by main.

A resposta correta é a E… mas … pq?

Se no lugar o Assertion error fosse uma IOException por exemplo … ia ser a C… mas pq q nesse caso ele não aceita ser tratada pelo bloco try e propaga a excessão para o main?

outra dpuvida é quanto a diferença entre a E e a F

E. A Throwable is thrown by main.
F. An Exception is thrown by main.

não entendi … o que no código iria diferenciar se é uma Throwable ou uma Exception?

aguem pode dar algum exemplo de um código q lance Throwable e outro q lance Exception?

brigadao gente

Você executou o código para ver o log?

Executei aqui e apresentou isso aqui:

Exception in thread "main" java.lang.AssertionError
        at ScanIn.test(ScanIn.java:5)
        at ScanIn.main(ScanIn.java:9)

Linha 5 é: if (true) throw new AssertionError();

Linha 9 é: try { test(); }

E era possível lançcar um AssertionError e ter um tratamento de exceção(try,cathc) no código para capturar um erro?

Corrigindo a no interrogação em lugar de aspas, vejamos:
main entra no try.
main chama test.
test lança AssertionError.
AssertionError não herda de Exception, logo não entra no catch.
AssertionError não é capturada em main, logo é lançada para fora deste.

Portanto a resposta é E.

Necessitam ser declarada no throws todos os Throwables que [color=red]não[/color] forem Error ou RuntimeException ou uma de suas subclasses.
AssertionError herda de Error, portanto não necessita ser declarada no throws.

Um erro comum em muitos sistemas que me fazem perder cabelos na hora de dar manutenção, tem falhas muito comuns deste tipo:

  1. Imaginar que Exception é a superclasse de todas as coisas que podem aparecer em um throw. Isso é falso. Exception [color=red]não é[/color] a superclasse de todas as coisas que podem aparecer em um throw. Esta superclasse é Throwable.

  2. Imaginar que algo que não herde de Exception (ou a própria classe Exception) nunca será lançado. Existem coisas que não são Exceptions (mas são Throwables) que podem ser lançadas (provavelmente Errors), e às vezes são lançadas. Exemplos são AssertionError, NoClassDefFoundError, OutOfMemoryError, StackOverflowError.

A regra é:
Throwable extends Object.
Error extends Throwable.
Exception extends Throwable.
RuntimeException extends Exception.

A) Se a coisa que está na cláusula throws não for um Throwable ou uma de suas subclasses, então dá erro de compilação. Isto não pode ser lançado.

B) Se a coisa que está na cláusula throws não for Error ou RuntimeException ou qualquer uma de suas subclasses, e não houver um catch para ela e nem um throws na assinatura do método, então dá um erro de compilação. Deveria estar declarado no throws ou então deveria ser capturado com catch.

O que é lançado em test() não é uma Exception. O bloco try catch trata apenas caso uma Exception seja lançada. AssertionError descende de (é) um Error, não uma Exception. Se a excessão lançada em test() fosse uma IOException ou qualquer outra descendente de Exception, C estaria correto.

Seria bom você revisar este assunto e fixar bem a árvore Throwable e suas descentes Error e Exception.

opa … entendi XD

obrigado ai pra todo mundu XD

E victor, muito bem explicado XD legal pacas

valew