Na verdade o recomendado é não tratar Error, já que estes quando ocorrem geralmente não tem o que fazer.
Exception são exceções previstas, que podem sempre ocorrer, e que quem criou o método esta avisando a que esta usando, para checar as exceções
Exceção não é um erro, é simplismente algo que não segue o fluxo normal das coisas, mais que pode ser contornado.
RuntimeException são exceções que normalmente podem ocorrer em tempo de execução, por isso não são necessariamente testadas em todo escopo, estas exceções devem receber o tratamento em sua origem…
Ps.: Apesar de RuntimeException ser sub-classe de Exception, vc não precisa de try{}catch(){} ao usar um método que gere esse tipo de exceção,
mais pode usar, caso queira tratar a exceção.
…
Para ficar um pouquinho + claro, NullPointerException … exceção gerado quando um objeto nulo é enviado a um escopo que não consegue realizar a tarefa quando este objeto é nulo…
Maioria dos métodos não testam a toda hora c a variavel é nula, principalmente quando isso não é esperado, por isso entede que quem esta usando, sabe que ele pode lançar essa exceção em Runtime, por isso não precisa declarar Try{}catch(){} … porem vc pode faze-lo …
Onde é o lugar de tratar esse tipo de exceção ?? geralmente na origem do problema…
digamos que vc recupere esse dado de uma interface, na hora q vc recuperar o dado, vc checa, e c for nulo, vc não tenta executar o método pois vai dar problema… e retorna uma msg do tipo, o campo X não pode ser nulo…
…
uma Exception é algo que foi pedido que vc trate… por exemplo, quando vc pede pra ler um Arquivo, pode ser que o arquivo não exista, ou que vc tenha escrito um nome de arquivo invalido, ou que vc não tenha acesso, etc etc… quando esses problemas ocorrem não da pra abrir o arquivo… neste caso, os métodos de abrir arquivo, pedem explicitamente para checar as exceções, e neste caso vc deve tratalas ^^
espero que de pra entender