Qual verdadeira diferença de Error e Exception?

Ae galera, qual diferença de error e exception???

Obrigado pela atenção!!!

Um Error é algo que vc nao precisa capturar quando ocorrer algum Error geralmente sua aplicação e fechada ou algo parecido. Uma Exception vc pode capturar ou nao (Se for algo de RuntimeException).

quer dizer que Error não tem como tratar???

Ter tem, mas veja só pra que vc iria tratar uma coisa dessas?

[code]public static void main(String[] args) {

	try{
		
		
		nuncaMaisVouParar();
		
		
	}catch(Error e){
		
		System.out.println("ahaha que legal");
		
	}[/code]

[code]static void nuncaMaisVouParar(){

	nuncaMaisVouParar();
	
	
}[/code]

[quote=evertonsilvagomesjava]Ter tem, mas veja só pra que vc iria tratar uma coisa dessas?

[code]public static void main(String[] args) {

	try{
		
		
		nuncaMaisVouParar();
		
		
	}catch(Error e){
		
		System.out.println("ahaha que legal");
		
	}[/code]

[code]static void nuncaMaisVouParar(){

	nuncaMaisVouParar();
	
	
}[/code][/quote]

Pode crê, entendi o que quis dizer!!!

vlw pela atenção!!!

Geralmente o erro não e tratado!

Existe um exemplo de que na maioria da situação um Erro é tratado???

O erro geralmente é algo tão catastrófico, que terá pouca utilidade em ser tratado.

A única utilidade é a que serve para todos as as demais exceções não tratadas: Gerar algum tipo de log, para que você possa identificar a causa do erro depois.

Exemplos de situações que geram erros são:

  • Falta de memória: A VM automaticamente mata a thread que estourar o limite de memória, e você não tem como impedir que seja morta, mesmo que capture o OutOfMemoryError;
  • Estouro de pilha: Exemplo dado pelo everton;
  • Morte da thread: A thread que gera esse erro foi morta pelo método stop(), e não poderá mais ser recuperada.

Como você pode ver, são situações catastróficas, sem muito o que se possa fazer. O ideal seria só capturar o Error, imprimir seu stack trace em um arquivo, e fechar a aplicação com uma mensagem mais amigável para seu usuário.

Existe um exemplo de que na maioria da situação um Erro é tratado???[/quote]
Não existe não… na verdade é o seguinte: se um Error puder ser tratado então ele não deveria estar lá, deveria ser uma Exception.

Reforçando o que foi dito, o Error é usado em situações que não existe nada a ser feito a não ser deixar a aplicação morrer! Por exemplo: estouro de pilha, estouro de memória, falha de assert (significa que aconteceu uma situação totalmente impossível).

Dificilmente um programador vai lançar erro em seu código.

EDIT: Essa resposta parece uma cópia malfeita da anterior mas ela foi postada enquanto eu estava digitando :slight_smile:

Existe um exemplo de que na maioria da situação um Erro é tratado???[/quote]

Não digo na maioria da situações, mas você pode querer tratar um OutOfMemoryError, e você mesmo tentar liberar a memória para a aplicação poder andar um pouco mais, ou preparar a aplicação para ser fechada graciosamente.

Realmente Errors quase sempre não são tratados pois são problemas na JVM, não tem saída a não ser terminar a aplicação. Seria como tentar a salvar a aplicação enquanto o processador está pegando fogo.

A classe Error e sua sub-classes representam situações excepcionais que poderiam acontecer no sistema em tempo de execução na jvm e o principal não podem ser tratados(por exemplo OutOfMemoryError), por representarem situações anormais da JVM
.

vlw mesmo galera, jah mataram minha dúvida!!!
:smiley:

Só um complemento. O difícil de um erro é que você nunca sabe nem quando, nem onde ele vai ocorrer.

Portanto, o único local onde ele pode ser tratado é no uncaughtExceptionHandler. É o mesmo que é utilizado quando uma RuntimeException é disparada e não capturada.

Você pode implementa-lo assim:

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { public void uncaughtException(Thread t, Throwable e) { System.err.println ("Aplicação finalizada por um erro imprevisto na thread " + t.getName()); e.printStackTrace(System.err); logarThrowable(e); //Grava o throwable, seja ele erro ou exception, num arquivo. } }

Vini esta foi uma boa dica para se anotar no seu spellJavaBook.
Vlw

[quote=MarcioCasteloBranco]Vini esta foi uma boa dica para se anotar no seu spellJavaBook.
Vlw[/quote]

Um servidor web já faz isso automaticamente (procure a documentação do servidor para saber onde).
A dica é válida principalmente para desktop.

[quote=ViniGodoy]Só um complemento. O difícil de um erro é que você nunca sabe nem quando, nem onde ele vai ocorrer.

Portanto, o único local onde ele pode ser tratado é no uncaughtExceptionHandler. É o mesmo que é utilizado quando uma RuntimeException é disparada e não capturada.

Você pode implementa-lo assim:

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { public void uncaughtException(Thread t, Throwable e) { System.err.println ("Aplicação finalizada por um erro imprevisto na thread " + t.getName()); e.printStackTrace(System.err); logarThrowable(e); //Grava o throwable, seja ele erro ou exception, num arquivo. } }[/quote]

vlw pela dica!!!