Visualizzazione dei risultati da 1 a 6 su 6

Discussione: eccezioni ...

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085

    eccezioni ...

    Ciao ..
    Mi stò immergendo proprio ora nel linguaggio Java, e aimè c'è una cosetta che non ho ben capito ..
    c'è qualche buon'anima che mi spiega come funzionano le eccezioni ?
    Intanto devo dire che mi sembra di aver capito che servono solo per gestire gli errori di sistema e
    non gli eventuali errori logici gestibili dal programmatore .. e su questo fatto vorrei poi capire
    se c'è qualche sistema (visto che non esiste il 'goto') per andare ad una label che interrompa la
    normale esecuzione e che gestisca l'errore ..

    ma ora mi sembrerebbe più importante capire con un esempio pratico cosa succede (gli step) con la seguente sintassi che trovo nel manuale.
    grazie mille

    try
    { <comando-con-eccezione> }
    catch (Exception ex)
    {ex.printStackTrace(); }


    class C
    {
    void method(int x) throws Exception
    {<comando-che-genera-eccezione> }
    }

  2. #2

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Leggiti anche i link riportati li sopra.

    Intanto devo dire che mi sembra di aver capito che servono solo per gestire gli errori di sistema e
    non gli eventuali errori logici gestibili dal programmatore
    Le eccezzioni sono "errori" durante il runtime. Esistono molti tipi di eccezzioni, e possono essere controllare dal programmatore. Exception è la superclasse! RuntimeException gestisce appunto un errore di runtime.
    Questa ha tante altre possibili eccezzioni ( http://java.sun.com/j2se/1.4.2/docs/...Exception.html guardati le sottoclassi).

    Il blocco try/catch viene utilizzato per gestire queste eccezzioni che possono essere lanciate. Una classica eccezione è la divisione per 0! (ArithmeticException).
    Il codice interessato deve essere messo all'interno di un try per essere catturato, se l'eccezione viene lanciata viene catturata da catch..che può eseguire un'altra operazione all'interno del suo blocco di codice.

    codice:
    try {
      // Codice che può lanciare un eccezione, codice da "osservare" insomma.
    } catch(Exception e) {
      // Codice da eseguire in caso venga lanciata l'eccezione
    }
    Se all'interno di try viene lanciata l'eccezione, l'operazione che ne scaturisce è un "salto" sino alla clausola catch() corrispondente (possono essere anche annidate, comunque guarda la documentazione).

    Al posto di Exception puoi mettere una sua sottoclasse (ad esempio se viene lanciato per una divisione per 0, lo puoi gestire con ArithmeticException).

    Esiste anche il blocco finally. Tutto quello racchiuso li dentro viene eseguito anche quando viene lanciata l'eccezione; è comodo quando devono essere liberate delle risorse come ad esempio la chiusura di un file o una connessione.

    throws, utilizzato su un metodo indica che quel metodo non gestirà l'eccezione ma la lancierà al metodo chiamante.
    throw invece lancia un eccezione.

    In più, puoi creare le tue eccezioni estendendo Exception.

    Un esempio molto veloce
    codice:
    class TestException {
      public static void main(String args[]) {
        int n=10;
    	for(int i=10; i>=0; i--) {
    	  System.out.println(n/i);
    	}
      }
    }
    Come puoi notare quando i sarà uguale a 0 verrà lanciata un eccezione.

    [code]
    1
    1
    1
    1
    1
    2
    2
    3
    5
    10
    Exception in thread "main" java.lang.ArithmeticException: / by zero
    at TestException.main(TestException.java:5)
    [/quote]

    Gestendola..

    codice:
    class TestException {
      public static void main(String args[]) {
        int n=10;
    	for(int i=10; i>=0; i--) {
    	  try {
    	    System.out.println(n/i);
    	  } catch(ArithmeticException e) { 
    	    System.out.println("Eccezione controllata");
    	  }
    	}
      }
    }
    Come noti fanno parte del package java.lang.Exception, che viene importato automaticamente.. non è quindi necessario importare nulla!

    output
    codice:
    1
    1
    1
    1
    1
    2
    2
    3
    5
    10
    Eccezione controllata
    Da dire ci sarebbe molto di più, per cui mi fermo qui e spero di averti aiutato. Guardati la documentazione per il resto

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Correggo e aggiusto solo alcune cose:

    Originariamente inviato da Patrick Jane
    Exception è la superclasse!
    Tecnicamente la classe base è Throwable.

    Originariamente inviato da Patrick Jane
    Esiste anche il blocco finally. Tutto quello racchiuso li dentro viene eseguito anche quando viene lanciata l'eccezione
    Sarebbe da descrivere in un altro modo. Ciò che c'è nel blocco finally viene eseguito in qualunque caso, che non sia stata lanciata alcuna eccezione, che sia stata lanciata e catturata o lanciata e non catturata (e gestita più a "monte"). In ogni caso il finally viene eseguito.

    Originariamente inviato da Patrick Jane
    throws, utilizzato su un metodo indica che quel metodo non gestirà l'eccezione ma la lancierà al metodo chiamante.
    Di per sé throws non vuol dire che il metodo non gestisce la eccezione .... vuol solo dire che il metodo può lanciare fuori quella eccezione e l'uso di questa dichiarazione da parte del compilatore serve principalmente per le eccezioni "checked".

    Comunque, come esempio, un metodo può benissimo dichiarare con throws una eccezione checked, all'interno catturarla, fare "qualcosa" (log o altro) e poi rilanciarla di fuori.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Originariamente inviato da andbin
    Correggo e aggiusto solo alcune cose:

    Tecnicamente la classe base è Throwable.
    Me ne ero scordato.. chiedo venia!

    Sarebbe da descrivere in un altro modo. Ciò che c'è nel blocco finally viene eseguito in qualunque caso, che non sia stata lanciata alcuna eccezione, che sia stata lanciata e catturata o lanciata e non catturata (e gestita più a "monte"). In ogni caso il finally viene eseguito.
    Intendevo questo quando ho detto che viene eseguito anche quando viene lanciata l'eccezione..ma avrei potuto specificare!

    Di per sé throws non vuol dire che il metodo non gestisce la eccezione .... vuol solo dire che il metodo può lanciare fuori quella eccezione e l'uso di questa dichiarazione da parte del compilatore serve principalmente per le eccezioni "checked".
    In sostanza la lancia se si verifica all'interno del metodo.. (no?)

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    1,085
    grazie mille !
    cerco di approfondire

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.