Sobes.tech
Junior

Quais são as principais classes de exceções em Java?

sobes.tech IA

Resposta da IA

Em Java, a hierarquia de exceções começa com a classe Throwable. Tem duas subclasses principais: Error e Exception.

Error:

  • Representa problemas graves que geralmente não devem ser capturados pela aplicação.
  • Ocorrem por culpa da máquina virtual (JVM) ou do ambiente.
  • Exemplos: OutOfMemoryError, StackOverflowError.

Exception:

  • Representa condições que a aplicação pode e deve tratar.
  • Divide-se em dois tipos:
    • Exceções verificadas (Checked Exceptions):
      • Devem ser capturadas (com blocos try-catch) ou declaradas na assinatura do método (throws).
      • O compilador verifica obrigatoriamente seu tratamento.
      • Geralmente representam condições previsíveis, mas indesejáveis, que podem ocorrer em tempo de execução.
      • Exemplos: IOException, FileNotFoundException, SQLException.
    • Exceções não verificadas (Unchecked Exceptions):
      • Herda de RuntimeException.
      • Não requer tratamento ou declaração obrigatória na assinatura do método.
      • Frequentemente indicam erros na lógica do programa ou uso incorreto da API.
      • Exemplos: NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException.

Aqui estão as classes principais de exceções:

  • java.lang.Throwable (Classe base)
    • java.lang.Error (Erros não tratáveis)
      • java.lang.OutOfMemoryError
      • java.lang.StackOverflowError
    • java.lang.Exception (Exceções tratáveis)
      • java.io.IOException (Verificada)
        • java.io.FileNotFoundException (Verificada)
      • java.sql.SQLException (Verificada)
      • java.lang.RuntimeException (Não verificada)
        • java.lang.NullPointerException
        • java.lang.IllegalArgumentException
        • java.lang.IndexOutOfBoundsException

Tabela comparativa:

Característica Exceção Verificada Exceção Não Verificada (RuntimeException) Error
Herança Exception (exceto RuntimeException e seus descendentes) RuntimeException Error
Tratamento/declaração obrigatória Sim Não Não
Causa Falhas previsíveis Erros de programação, uso incorreto Problemas graves de JVM/ambiente
Recuperação após Frequentemente possível Raramente (indica um bug) Praticamente impossível

Exemplo de tratamento de exceções:

// Exemplo de tratamento de exceção verificada e não verificada
public class ExceptionHandlingDemo {

    public void readFile(String fileName) {
        try {
            // Tentativa de leitura de arquivo - pode lançar FileNotFoundException (verificada)
            java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.FileReader(fileName));
            String line = reader.readLine();
            while (line != null) {
                System.out.println(line);
                line = reader.readLine();
            }
            reader.close(); // Também pode lançar IOException (verificada)

            // Exemplo de exceção não verificada (pode ocorrer se fileName == null)
            int length = fileName.length(); // NullPointerException (não verificada)

        } catch (java.io.FileNotFoundException e) {
            // Tratamento de FileNotFoundException
            System.err.println("Erro: Ficheiro não encontrado - " + e.getMessage());
        } catch (java.io.IOException e) {
            // Tratamento de erros gerais de entrada/saída
            System.err.println("Erro ao ler o ficheiro: " + e.getMessage());
        } catch (java.lang.NullPointerException e) {
            // Tratamento de NullPointerException - opcional, mas boa prática para depuração
            System.err.println("Erro: Referência nula utilizada - " + e.getMessage());
        }
    }

    public static void main(String[] args) {
        ExceptionHandlingDemo demo = new ExceptionHandlingDemo();
        demo.readFile("non_existent_file.txt"); // Vai lançar FileNotFoundException
        demo.readFile(null); // Pode lançar NullPointerException
    }
}