Java – Quando é um erro do compilador e quando é uma exceção de tempo de execução?

Atualmente estou estudando para a certificação SCJP usando o Guia de Estudo Sierra e Bates e em muitos dos autotestes (perguntas do exame simulado) eu continuo correndo para o mesmo problema – eu não posso dizer se um erro em particular estará em tempo de execução (um exceção) ou na compilation (erro de compilation). Eu sei que esta é uma pergunta um pouco vaga e que talvez não seja possível responder, mas, como posso saber se um erro será encontrado na compilation ou em tempo de execução? Você poderia me enviar alguns links de sites que poderiam me ajudar?

Erro de tempo de compilation – o compilador java não pode compilar o código, geralmente devido a erros de syntax. Candidatos típicos:

  • suportes ausentes
  • falta de ponto e vírgula
  • access a campos privados em outras classs
  • classs ausentes no caminho de class (no tempo de compilation)

Erro de tempo de execução – o código compilado, pode ser executado mas falha em algum momento, como se você tivesse uma divisão por zero.

  • usando variables ​​que são realmente null (podem causar NullPointerException)
  • usando índices ilegais em matrizes
  • acessando resources que estão indisponíveis no momento (arquivos ausentes, …)
  • classs ausentes no caminho de class (em tempo de execução)

(‘Crashes’ realmente não é o termo correto e é usado apenas para ilustrar o que acontece)

Não há uma resposta fácil para isso; Para ver se algo vai compilar, você tem que entender completamente a especificação da linguagem e a API envolvida. Você essencialmente tem que agir como um compilador, e ninguém pode fazer isso perfeitamente. Até os compiladores nem sempre seguem a especificação perfeitamente.

Existem muitos, muitos casos de canto na linguagem Java. É por isso que coisas como Java Puzzlers são tão intrigantes: as pessoas nem sempre sabem se algo compilaria e / ou se isso acontece, o que realmente está acontecendo.

Algumas das áreas mais complicadas da linguagem Java são:

  • Generics (Eclipse e o compilador javac não conseguem nem concordar com tudo)
  • Método de sobrecarga de resolução (um dos mais difíceis de entender seção do JLS)

Perguntas relacionadas

  • É 1/0 uma expressão Java legal?
  • Qual é a diferença entre o javac e o compilador Eclipse?

Basicamente, os erros de tempo de execução são erros lógicos em seu código, mesmo se o código estiver sintaticamente correto. Erros do compilador referem-se a erros em sua syntax / semântica. Se você tiver um erro de compilador em seu código, o programa nunca será executado (e verificará a lógica do código). Se você tiver erros sintáticos e lógicos, primeiro obterá o erro do compilador (erro de syntax) e, quando executar o código novamente, receberá um erro de tempo de execução (erro lógico).