Olá, estou com uma dificuldade em estabelecer um critério para identificar quando uma exceção é lançada programaticamente ou pela JVM.
Por exemplo, porque NullPointerException é lançada pela JVM e NumberFormatException é lançada programaticamente?
Não consigo definir um critério que as diferencie…
Alguém pode me ajudar?
Forte Abraço.
Paulo Gervásio
Uma exceção lançada pela JVM é algo que não foi explicitamente programado. Por exemplo, não é preciso que seu programa tenha isto codificado:
if (referencia == null) {
throw new NullPointerException();
}
para que uma NullPointerException seja lançada se você for usar uma variável com valor null. Basta tentar usar:
Objeto referencia = null;
System.out.println (referencia.toString()); // isto causará uma NullPointerException, sem que esteja explicitamente programada no método toString()
São relativamente poucas as tais exceções. Algumas delas são:
- NullPointerException - porque a própria JVM é que faz o teste de cada referência contra null (na verdade ela nem compara com o valor 0; em vez disso, a JVM solicita ao sistema operacional que este programe o processador para que referências inválidas a memória sejam tratadas como exceções do sistema operacional, e essas são transformadas em exceções da JVM);
- ArithmeticException - quando há uma divisão INTEIRA por zero, o processador costuma gerar uma exceção também, que é processada pelo sistema operacional, e por sua vez essa exceção é tratada pela JVM e convertida em uma ArithmeticException;
- OutOfMemoryException - essa exceção não é uma “exceção de hardware” (como se costuma chamar as 2 exceções anteriores, que são suportadas diretamente pelo próprio processador). Em vez disso, ela é criada pela JVM quando o seu sistema de alocação de memória não conseguiu alocar mais memória (mesmo efetuando a limpeza de lixo) por algum motivo.
No post anterior, o correto não seria OutOfMemoryError ao invés de OutOfMemoryException?
Ou estou errado?
OK, é OutOfMemoryError. “Falha noça”…