|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
[JAVA] Eccezioni checked ed uncheked...mi aiutate a fare chiarezza ?!?!
Ho da poco iniziato a studiare per un secondo esame di programmazione OO...nel programma del corso si parla di eccezioni cheked e di eccezini unchecked.
Da quello che ho capito le prime estendono la classe Exception e basta (ma non la classe Runtime Exception figlia di Exception) mentre le seconde estendono la classe RuntimeException. Ma che significa esattamente? Che le uncheked sono eccesioni riferite ad eventi eccezionali che avvengono a runtime (che ne sò tipo provo ad accedere all'(n+1)esimo elemento di un array di n elementi e mi viene restituita una IndexOutOfBoundException) mentre le checked? Quando le uso? Ho qualche dubbio. A logica dire che un possibile caso d'uso potrebbe essere questo: ho un metodo fact che riceve un intero e ne restituisce il fattoriale, per avere senso tale parametro deve essere >0...quindi potrei scrivere una mia eccezione checked (quindi estendendo Exception) che viene sollevata se il parametro è <= 0 e per esempio potrebbe gestirla cabiandogli segno e facendo comunque eseguire il metodo che ora potrebbe calcolare il fattoriale (se è 0 boo magari fà qualche altra cosa)...questo perchè l'evento eccezionale è stato in qualche modo previsto prima come una possibilità che potrebbe accadere... Fila come discorso? Poi altro dubbio...se dichiaro un'eccezione come checkd la devo dichiarare per forza nell'header della mia routine e devo per forza scrivere il codice che la gestisce, giusto? Cos'è il mascheramento di un'eccezione? (questa cosa non l'ho proprio capita) Grazie Andrea |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
Detta in poche righe praticamente quando vai a creare una classe o metodo definendolo "generatore" di proabile eccezione a tempo di esecuzione hai queste due possibilità, definirlo come una Exception o come una RuntimeException:
Codice:
public void method() throws Exception {
}
public void method() throws RuntimeException {
}
Quà trovi spiegato tutto anche con dei chiari esempi .... http://tutorials.jenkov.com/java-exc...xceptions.html
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
l'eccezione non controllata può essere catturata esattamente come l'eccezione controllata e in più può essere gestita tramite un UncaughtExceptionHandler.
Detto questo in Java l'unica certezza è che i progettisti hanno introdotto le eccezioni non controllate perchè esistono condizioni di impossibilità al raggiungimento di uno scopo per un blocco di codice talmente "pervasive" che costringere ogni volta il programmatore ad usare un blocco try-catch avrebbe ammazzato il linguaggio sul nascere. Basti pensare alla divisione in cui il divisore sia una variabile (incombe la DivisionByZeroException) o all'accesso ad un membro (la nota NullPointerException). E' difficile trovare una sistemazione teorica per la suddivisione controllata/non controllata. Una volta stabilito che l'eccezione è appunto una condizione di impossibilità al raggiungimento di uno scopo da parte di un blocco di istruzioni per causa esterna al blocco stesso cosa potremmo dire, che l'eccezione dev'essere controllata lo scopo del blocco se è veramente importamente? Fa un po' ridere |
|
|
|
|
|
#4 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
mmm quindi praticamente mi stai dicendo che una unchecked exception non posso mai gestirla nel codice? Mi sorgono ancora più dubbi...sul mio libro dice che le checked exception devo per forza gestirle scrivendo il codice che gestisce la situazione eccezionale altrimenti avrò un errore in fase di compilazione ma non mi dice che è vietato fare try catcth con le unchecked exception...anzi riporta questo codice d'esempio: Codice:
try{ x = y[n];}
catch(IndexOutOfBoundsException e){
// CODICE CHE GESTISCE IndexOutOfBoundsException
}
i = Array.search(z,x)
Come mai? Grazie Andrea |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2002
Città: Palermo
Messaggi: 4913
|
Tu, puoi gestire entrambi i tipi di eccezioni, catturandole.
Nel caso delle unchecked, non sei costretto a gestirle, nel senso che non è necessario ogni due righe verificare con un try-catch una NullPointerException. Invece sei costretto* a gestire con un try-catch l'altro tipo di eccezioni tipo: Codice:
try{
...
metodoCheSeNeFrega();
..
}catch(IOException){System.out.println("eccezione catturata");}
Faccio l'esempio: Codice:
void metodoCheGestisce(){
try{
void metodoCheSeNeFrega();
}catch(IOException){System.out.println("hai cercato di convertire una stringa che non è un numero);}
void metodoCheSeNeFrega() throws IOException{
throw new IOException();
}
__________________
Sun Certified Java Programmer - Sun Certified Web Component Developer - Sun Certified Business Component Developer Ultima modifica di gokan : 30-04-2009 alle 22:55. Motivo: Corretto l'esempio |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Se vuoi approfondire l'argomento, ci sono un paio di link:
Does Java need Checked Exceptions? The Trouble with Checked Exceptions
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2002
Città: Palermo
Messaggi: 4913
|
oops hai ragione
correggo l'esempio. però la spiegazione spero resti valida
__________________
Sun Certified Java Programmer - Sun Certified Web Component Developer - Sun Certified Business Component Developer |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Sep 2001
Città: de_legato
Messaggi: 792
|
perchè aveva torto!
__________________
---------------------------------------------- File reality.sys corrupted, Reboot Universe? Y/N ---------------------------------------------- |
|
|
|
|
|
#10 | |
|
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Quote:
Codice:
try{
...
metodoCheSeNeFrega();
..
}catch(IOException){System.out.println("eccezione catturata");}
|
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
|
Quote:
O comunque se non gestisci una checked non compila
__________________
Khelidan |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Apr 2002
Città: Palermo
Messaggi: 4913
|
Quote:
metodoCheSeNeFrega() non gestivi l'eccezione, ma ammettevi che poteva generare un 'eccezione. Nel secondo, metodoCheGestisce() invece, l'hai gestita tramite un try-catch. bye
__________________
Sun Certified Java Programmer - Sun Certified Web Component Developer - Sun Certified Business Component Developer |
|
|
|
|
|
|
#13 | |||
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Provo a fare un riassunto schematico?
La mamma di tutte le eccezioni: java.lang.Throwable Quote:
java.lang.Error (extends java.lang.Throwable) Lasciamolo stare, per il momento. L'altra figlia, sorella di Error e molto più famosa: java.lang.Exception (extends java.lang.Throwable) Quote:
Normalmente un figlio di Exception che viene lanciato da un metodo, deve per forza essere gestito al livello del chiamante di quel metodo, in un blocco try-catch. Il chiamante può gestire la situazione come vuole, ma deve catturare l'eccezione. Queste sono le eccezioni "checked". Tra tutte le numerosissime figlie che Exception ha generato nel clan del JDK, una in particolare è la pecora nera della famiglia: java.lang.RuntimeException (extends Exception) Quote:
In pratica queste sono le eccezioni "unchecked".
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 04-05-2009 alle 10:34. |
|||
|
|
|
|
|
#14 | ||
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Facciamo un esempio
Facciamo un esempio della differenza tra eccezioni "checked" e "unchecked" dal punto di vista del chiamante.
Supponiamo di dover istanziare un oggetto di tipo java.io.FileInputStream. Usiamo il costruttore che prende come parametro una String, che rappresenta il "path name" del file: Quote:
Quote:
Consultando i javadoc per la classe FileNotFoundException si scopre che questa estende IOException la quale estende Exception: abbiamo dunque a che fare con un'eccezione "checked", dobbiamo quindi catturarla (inoltre notiamo che è citata nella clausola throws del metodo stesso). Consultiamo ora i javadoc per la classe SecurityException, e scopriamo così che essa estende RuntimeException: dunque è di tipo "unchecked", e non siamo obbligati a catturarla (però potremmo volerlo fare lo stesso, la scelta è nostra). Il codice che istanzierà il nostro oggetto FileInputStream dovrà quindi gestire il caso in cui viene lanciata una FileNotFoundException, invece pe la SecurityException non occorre fare nulla: scegliamo di non gestirla, in questo caso. Codice:
String filePath = "un file path espresso come stringa e ricavato in qualche modo dall'applicazione";
...
...
FileInputStream fileStream = null;
try
{
fileStream = new FileInputStream(filePath);
// seguono istruzioni che utilizzano il file aperto
...
}
catch (FileNotFoundException ex)
{
// segue gestione dell'eccezione che dipende da come si
// vuole gestire la faccenda
...
}
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 04-05-2009 alle 10:35. |
||
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Per concludere, ti linko delle info utili (tutorial dal sito della Sun) su come creare/lanciare le proprie eccezioni (tutto in inglese ovviamente):
- How to Throw Exceptions - Creating Exception Classes queste sopra sono solo due parti diell'intero argomento: - Lesson: Exceptions
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:09.




















