[SCJP] Excessões lançadas pela JVM e excessões lançadas programaticamente

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”…