Eccezioni, blocco istruzioni try catch

di il
5 risposte

Eccezioni, blocco istruzioni try catch

Salve a tutti,

come da titolo mi sto esercitando con le eccezioni.

Devo implementare questa classe:

Scrivere una classe astratta Java Opera, contenente i campi privati nome (String) e anno (int), durata(int), valutazioni (int[]) e il seguente metodo d'istanza:

public Opera (String titolo, int anno, int durata); crea un oggetto di tipo Opera ed assegna a ciascun campo dati il valore del parametro omonimo. In caso durata <= 0, o anno < 1900, il costruttore lancia un’eccezione accompagnata da un opportuno messaggio di errore, distinguendo i due casi.


Eccola qui:
public class Opera 
{
    private String nome;
    private int anno;
    private int durata;
    private int[] valutazioni;
    
    public Opera (String titolo, int anno, int durata) throws Exception
    {
        if(durata <= 0)
            throw new Exception("Errore: durata <= 0");
        if(anno < 1900)
            throw new Exception("Errore: anno < 1900");
            
        this.nome = titolo;
        this.anno = anno;
        this.durata = durata;
    
    }
}
    
Da quello che ho capito, nel caso in cui si entrasse in uno dei due if, il metodo (costruttore) interromperebbe la sua esecuzione e lancerebbe l'eccezioni al metodo chiamate (in questo caso il main che vedete qui sotto):
public class Main 
{
    public static void main(String[] args) 
    {
         try {
                Opera prima = new Opera("Back in black", 1980, 0);
            
              } 
         catch (Exception ex) 
        {
            
        }

}
Ok, in questo caso nel try si riscontrerebbe un'eccezione e infatti mi viene stampato il messaggio relativo a quell'errore ("Errore: durata <= 0").

Quello che non ho capito è: che devo farci con il catch ?

Cioè, so che deve contenere il blocco di istruzioni utili per la gestione dell'eccezione. Ma con gestione che si intende? Dovrei cambiare la durata dell'opera? Non posso perché è di tipo private.

Oppure solamente un messaggio di errore?
E se volessi inserire il finally, dentro che ci andrebbe?

Grazie

5 Risposte

  • Re: Eccezioni, blocco istruzioni try catch

    Il throws serve per specificare le eccezioni che possono riscontrasi utilizzando quel metodo rilanciando al metodo chiamante la loro gestione.... il throw lancia una eccezione

    nel blocco try catch vengono catturate e gestite le eccezioni nel try si scrivono le parti di codice che potrebbero generare una o più eccezioni, mentre nel catch vengono specificate le eccezioni accorse e la loro gestione..infine con il finally è possibile specificare un blocco di codice le cui istruzioni saranno sempre eseguite con o senza eccezione..
  • Re: Eccezioni, blocco istruzioni try catch

    Suggerimento: sollevare eccezioni di tipo Exception non e' considerato un buon stile di programmazione, e' sempre meglio sollevare eccezioni che ereditano da questa.
    Inoltre si tratta di un controllo di validita'; in pratica l'eccezione viene sollevata in caso di errore di programmazione. Obbligare l'utilizzatore della tua classe a fare il catch di una simile eccezione e' un po' una cattiveria
    In questi casi e' d'uopo sollevare una RuntimeException, la quale puo' essere catturata o meno, a seconda dello stile di programmazione e della situazione in cui ci si trova....
  • Re: Eccezioni, blocco istruzioni try catch

    ant ha scritto:


    il throws serve per specificare le eccezioni che possono riscontrasi utilizzando quel metodo rilanciando al metodo chiamante la loro gestione.... il throw lancia una eccezione

    nel blocco try catch vengono catturate e gestite le eccezioni nel try si scrivono le parti di codice che potrebbero generare una o più eccezioni, mentre nel catch vengono specificate le eccezioni accorse e la loro gestione..infine con il finally è possibile specificare un blocco di codice le cui istruzioni saranno sempre eseguite con o senza eccezione..
    Sì, questo lo sapevo. Ma volevo una delucidazione per questo caso qui.

    sottovento ha scritto:


    Suggerimento: sollevare eccezioni di tipo Exception non e' considerato un buon stile di programmazione, e' sempre meglio sollevare eccezioni che ereditano da questa.
    Ho provato ad estendere Exception in questo modo:
    public class ErroreAnno extends Exception 
    {
        public ErroreAnno() 
        {
            super("L'anno deve essere maggiore di zero.");
        }
    }
    E nel main:
    try { 
            prima = new Opera("Back in black", 1980, 3);
         }
    catch (ErroreAnno ex) 
         {
           System.out.println("L'anno deve essere > 1900.");
         }
    
    Va bene? Ho implementato seguendo una guida su internet.
    Ma super("L'anno deve essere maggiore di zero."); a che serve?

    Quando l'anno non va bene viene eseguito solamente il catch, il super che utilità ha?

    sottovento ha scritto:


    In questi casi e' d'uopo sollevare una RuntimeException, la quale puo' essere catturata o meno, a seconda dello stile di programmazione e della situazione in cui ci si trova....
    Come potrei fare?
  • Re: Eccezioni, blocco istruzioni try catch

    davide.fruci ha scritto:


    Ho provato ad estendere Exception in questo modo:
    public class ErroreAnno extends Exception 
    {
        public ErroreAnno() 
        {
            super("L'anno deve essere maggiore di zero.");
        }
    }
    E nel main:
    try { 
            prima = new Opera("Back in black", 1980, 3);
         }
    catch (ErroreAnno ex) 
         {
           System.out.println("L'anno deve essere > 1900.");
         }
    
    Va bene? Ho implementato seguendo una guida su internet.
    Va benissimo!

    davide.fruci ha scritto:


    Ma super("L'anno deve essere maggiore di zero."); a che serve?

    Quando l'anno non va bene viene eseguito solamente il catch, il super che utilità ha?
    Stai chiamando il costruttore della class Exception (i.e la class padre) che accetta un parametro stringa (cioe' l'errore che vuoi trasferire). Stai correttamente riutilizzando il codice gia' scritto della class base. Mi sembra una buona cosa

    davide.fruci ha scritto:


    sottovento ha scritto:


    In questi casi e' d'uopo sollevare una RuntimeException, la quale puo' essere catturata o meno, a seconda dello stile di programmazione e della situazione in cui ci si trova....
    Come potrei fare?
    Semplicemente ereditando da RuntimeException invece che da Exception. Il resto rimane uguale.

    Se erediti da RuntimeException, non hai bisogno di usare la clausula throws nella dichiarazione del metodo e farne il try...catch e' facoltativo (se non lo fai, il programma terminera' e JVM stampera' il tuo messaggio di errore).
    Normalmente per errori di programmazione (come puo' essere classificato questo) e' una buona soluzione. E' un errore diverso, per esempio, da una mancata apertura di un file: in quest'ultimo caso e' opportuno che lo sviluppatore ne sia consapevole e che scriva un blocco try... catch per gestirlo.
  • Re: Eccezioni, blocco istruzioni try catch

    sottovento ha scritto:


    Semplicemente ereditando da RuntimeException invece che da Exception. Il resto rimane uguale.

    Se erediti da RuntimeException, non hai bisogno di usare la clausula throws nella dichiarazione del metodo e farne il try...catch e' facoltativo (se non lo fai, il programma terminera' e JVM stampera' il tuo messaggio di errore).
    Normalmente per errori di programmazione (come puo' essere classificato questo) e' una buona soluzione. E' un errore diverso, per esempio, da una mancata apertura di un file: in quest'ultimo caso e' opportuno che lo sviluppatore ne sia consapevole e che scriva un blocco try... catch per gestirlo.
    Chiaro, grazie mille. Buona serata
Devi accedere o registrarti per scrivere nel forum
5 risposte