Temi gli errori, ma non scriverli in Java! Probabilmente sai già alcune cose sulle eccezioni in Java . Oggi, almeno una conoscenza superficiale ti gioverà. Analizzeremo la classe Error e un tipo di eccezione speciale che spaventa molte persone quando appare nelle loro tracce dello stack.

In cima alla gerarchia delle eccezioni di Java c'è la classe Throwable , che ha due discendenti:

  • Eccezione , che è responsabile degli errori nel tuo programma.
  • E il nostro eroe per oggi — Error , che è responsabile degli errori nella JVM.
    Vale la pena ricordare che probabilmente non si tratta nemmeno di bug di codifica, ma piuttosto di problemi che di solito non dipendono dallo sviluppatore.

Cosa fare con un errore

Quando si rilevano "errori", non è possibile eseguire alcuna azione nel blocco catch , ad eccezione del logging , poiché si tratta di problemi nella JVM stessa.

La registrazione è buona: quando ricevi un errore di runtime, puoi guardare i registri, vederne la causa e sapere cosa correggere.

Dal momento che non sai che tipo di errore potresti ottenere quando scrivi il tuo codice, non ha senso scrivere un particolare tipo nel blocco catch . Anche l'utilizzo della stessa classe Error non è la soluzione migliore, poiché in questo caso rileverai solo errori.

Di conseguenza, è meglio utilizzare la classe Throwable , che può rilevare sia Error che Exception . Come funziona in pratica?

Non va bene scrivere codice come questo:

try {
    // Your code
} catch (OutOfMemoryError outOfMemoryError) {
    // Code to catch OutOfMemoryError
}
Anche scrivere codice come questo non va bene:

try {
    // Your code
} catch (Error error) {
    // Code to catch all Errors
}
Ma un codice come questo va bene:

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

La seconda opzione per gestire gli errori è lanciarli più in alto dopo aver dichiarato una clausola throws sul metodo. Questa tecnica viene utilizzata quando il tuo codice potrebbe teoricamente generare un errore e vuoi avvisare tutti coloro che potrebbero utilizzare il tuo codice in modo che possano gestire correttamente l'errore.

Errori comuni

Alcuni degli errori più comuni sono le classi OutOfMemoryError e StackOverflowError .

OutOfMemoryError appare spesso quando il programma non ha memoria sufficiente per creare oggetti e il Garbage Collector non riesce a tenere il passo. Il risultato è un OutOfMemoryError .

Java non ti consente di eliminare manualmente gli oggetti per prevenire perdite di memoria, ma puoi evitare il littering in modo da non sovraccaricare il garbage collector e non ingombrare l'heap.

Ad esempio, un codice come questo creerà molta spazzatura in memoria:


while (true) {
    new Object();
}

Il secondo errore di cui voglio parlarti è StackOverflowError , che viene generato quando lo stack va in overflow. Poiché lo stack memorizza principalmente variabili locali, parametri e chiamate di metodo, la ricorsione (o una chiamata di metodo ricorsiva) è una causa molto comune di questo errore:


public void foo() {
    foo();
}

Per evitare problemi durante l'esecuzione del programma, gli IDE moderni spesso avvertono di chiamare i metodi in modo ricorsivo.

Non puoi correggere un programma che genera Errors , ma puoi scrivere codice che non genererà un errore e non interromperà il tuo programma. Guarda cosa fai con la memoria, crea oggetti con attenzione e chiama correttamente i metodi. Se lo fai, avrai meno problemi nel tuo codice.

Differenza tra i tipi Error ed Exception

Errore Eccezione
Non può essere corretto nel blocco catch Può essere gestito in un blocco di cattura
Non si verifica in fase di compilazione Può essere catturato in fase di compilazione
Problemi nella JVM Problemi nella logica del codice
Tutti gli errori sono deselezionati selezionato e deselezionato

Non puoi sfuggire alle eccezioni in Java, ma non dovresti averne paura. Devi solo capire cosa rappresenta ogni tipo e sapere come gestirlo. È tutto per oggi! Ci vediamo!