Uma coisa que eu ainda não entendi muito bem é o esquema de checked e unchecked exceptions. Tipo, como eu sei qual exception eh checked e qual nao eh, e como eu faco pra implementar tais exceptions. Por exemplo, como eu faria pra forcar o usuario a tratar determinada exeption, e da mesma maneira como dizer que tal metodo lanca tal excecao, porem sem obriga-lo a tratar a exception.
Uma excecao eh Unchecked se ela tem, em sua linha genealogica, a classe java.lang.RuntimeException.
Uma RuntimeException eh uma excecao que voce pode lancar sem ter de colocar na clausula throws (mas se voce quiser, voce pode), e voce pode chamar um metodo que lanca esse tipo de excecao, sem fazer o bloco try (se voce quiser, pode fazer tambem).
Excecoes runtime sao geralmente um bug, como ArrayIndexOutOfBounds e NullPointer, sao coisas que nao deveriam acontecer se voce tomasse cuidado.
CheckedExceptions sao todas as outras que nao sao Runtime, e nao sao java.lang.Error. O Erro funciona MAIS OU MENOS como uma Runtime, ja que ela nao eh checked!
Estava lendo a Revista Java Magazine, edição 51, que fala: Checked Exceptions - As classes de exceções checadas são derivadas de Exception, mas não de RuntimeException. O código a seguir mostra um método declarando uma exceção checada (NumberFormatException é uma subclasse direta de Exception):
public int stringToInt(String value)
throws NumberFormatException{...};
Eu fiquei pensando: Poxa vida, NumberFormatException é subclasse direta de Exception?! NumberFormatException não é então considerada uma Unchecked Exception?
Pergunta: Foi falha do autor ou eu estou ficando louca?
Com certeza o autor equivocou-se, pois se você escrever o código abaixo verás que não será preciso lançar a exception no chamador:
package teste;
public class Teste {
public int stringToInt(String value)
throws NumberFormatException{
return 0;
}
public void testeChecked(){
System.out.println(stringToInt("2"));
}
}
Mas para realmente provar que isso não é verdade é so verificar a hierarquia veja:
public
class NumberFormatException extends IllegalArgumentException {
...
public
class IllegalArgumentException extends RuntimeException {
...
Ou seja, NumberFormatException herda de IllegalArgumentException que herda de RuntimeException.