Eccezioni checked ed unchecked


DOMANDA:

Perché alcune eccezioni mi generano errore durante la compilazione ed altre no?


RISPOSTA:

In Java esistono due tipi di eccezioni: le unchecked come nel caso delle RuntimeException e quelle checked (ad esempio le Exception).
La regola che differenzia i due tipi di eccezione è la seguente:
le eccezioni unchecked non obbligano il programmatore a gestirle, quelle checked invece si.
Facciamo un esempio chiarificatore.

Eccezione UNCHECKED:
  package eccezioni;    

  public class Eccezione1 extends RuntimeException{

     public Eccezione1(String msg){ 
       super(msg);   
    }
  }

Eccezione CHECKED:
  package eccezioni; 

  public class Eccezione2 extends Exception{
     public Eccezione2(String msg){ 
       super(msg);   
    } 
  }

Classe che lancia i due tipi di eccezioni:
package eccezioni; 

public class LanciaEccezioni {

 public void lancioEccezione1(){
    throw new Eccezione1("ECCEZIONE 1");
 }
 
 public void lancioEccezione2() throws Eccezione2{
    throw new Eccezione2("ECCEZIONE 2");
 }
}
Come si può vedere, mentre nel metodo lanciaEccezione1() non sono obbligato a gestire l'eccezione, nel metodo lancioEccezione2() si è obbligati ad inserire la clausola throws (oppure un blocco try/catch).

La motivazione dell'esistenza di exception non controllate (unchecked) è dovuta all'esigenza di evitare di sovraccaricare il codice quando sussistono condizioni di impossibilità di generazione di un'eccezione.


Esempi di frequenti eccezioni unchecked sono la divisione per zero (DivisionByZeroException), la conversione da una stringa a un numero (NumberFormatException) e tantissime altre.

Invece alcuni esempi famosi di eccezioni checked sono le IOException o le SQLException.


Commenti

  1. Ottima spiegazione. Mi chiedevo come si innesta il concetto di Throwable.

    Posso fare un catch(Throwable) e gestire tutto indipendentemente dal tipo di eccezione?

    Colgo l'occasione per chiederti se in un blocco try..catch è possibile identificare la riga esatta che ha generato l'errore.

    Grazie
    Francesco

    RispondiElimina
    Risposte
    1. Ciao Francesco, innanzitutto complimenti a te, sei il primo "commentatore" del mio Blog! :o)

      Puoi tranquillamente fare un catch Throwable che catturi tutte le eccezioni. Sia RuntimeException che Exception sono classi che ereditano da Throwable.

      Riguardo alla seconda domanda, non so se ho capito bene, comunque ci sono più modi: 1 - debug (ovviamente); 2 - puoi stampare su un file di log, a video o dove ti pare lo Stack Trace dell'eccezione (facciamo un esempio con Exception ex; nel catch fai ex.printStackTrace(); e hai tutto lo Stack stampato con la riga di codice dalla quale si è scatenato).

      Ciao

      Elimina

Posta un commento

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java