Tema erros, mas não os escreva em Java! Você provavelmente já sabe algumas coisas sobre exceções em Java . Hoje, pelo menos um conhecimento superficial o beneficiará. Vamos analisar a classe Error e um tipo especial de exceção que assusta muita gente quando aparece em seus stack traces.

No topo da hierarquia de exceções de Java está a classe Throwable , que possui dois descendentes:

  • Exception , que é responsável por erros em seu programa.
  • E nosso herói de hoje — Error , que é responsável por erros na JVM.
    Vale ressaltar que provavelmente nem são bugs de codificação, mas sim problemas que normalmente não dependem do desenvolvedor.

O que fazer com um erro

Ao capturar "erros", não é possível executar nenhuma ação no bloco catch , exceto logar , pois estamos falando de problemas na própria JVM.

O registro é bom: quando você recebe um erro de tempo de execução, pode consultar os logs, ver sua causa e saber o que corrigir.

Como você não sabe que tipo de erro pode obter ao escrever seu código, não faz sentido escrever um tipo específico no bloco catch . Usar a classe Error em si também não é a melhor solução, pois neste caso, você só pegará erros.

Assim, é melhor usar a classe Throwable , que pode capturar Error e Exception . Como isso se parece na prática?

Não é correto escrever um código como este:

try {
    // Your code
} catch (OutOfMemoryError outOfMemoryError) {
    // Code to catch OutOfMemoryError
}
Escrever código como este também não é bom:

try {
    // Your code
} catch (Error error) {
    // Code to catch all Errors
}
Mas código como este está OK:

try {
    // Your code
} catch (Throwable throwable) {
    // Code to catch all Throwables
}

A segunda opção para lidar com erros é lançá -los mais alto após declarar uma cláusula throws no método. Essa técnica é usada quando seu código pode, teoricamente, lançar um erro e você deseja avisar a todos que possam usar seu código para que possam lidar adequadamente com o erro.

Erros comuns

Alguns dos erros mais populares são as classes OutOfMemoryError e StackOverflowError .

OutOfMemoryError geralmente aparece quando o programa não tem memória suficiente para criar objetos e o coletor de lixo não consegue acompanhar. O resultado é um OutOfMemoryError .

O Java não permite que você exclua objetos manualmente para evitar vazamentos de memória, mas você pode evitar o lixo para não sobrecarregar o coletor de lixo e não sobrecarregar a pilha.

Por exemplo, um código como este criará muito lixo na memória:


while (true) {
    new Object();
}

O segundo erro sobre o qual quero falar é o StackOverflowError , que é lançado quando a pilha estoura. Como a pilha armazena principalmente variáveis ​​locais, parâmetros e chamadas de método, a recursão (ou uma chamada de método recursiva) é uma causa muito comum desse erro:


public void foo() {
    foo();
}

Para evitar problemas durante a execução do programa, os IDEs modernos geralmente alertam sobre chamar métodos recursivamente.

Você não pode corrigir um programa que gera Erros , mas pode escrever um código que não gere um erro e interrompa seu programa. Observe o que você faz com a memória, crie objetos com cuidado e chame os métodos corretamente. Se você fizer isso, terá menos problemas em seu código.

Diferença entre os tipos Error e Exception

Erro Exceção
Não pode ser corrigido no bloco catch Pode ser manipulado em um bloco catch
Não ocorre em tempo de compilação Pode ser capturado em tempo de compilação
Problemas na JVM Problemas na lógica do código
Todos os erros estão desmarcados marcado e desmarcado

Você não pode escapar de exceções em Java, mas não deve ter medo delas. Você só precisa entender o que cada tipo representa e saber como lidar com isso. Isso é tudo por hoje! Vê você!